gpt4 book ai didi

java - 为什么调整 JTable 列的大小会产生垃圾?

转载 作者:行者123 更新时间:2023-11-30 05:53:51 25 4
gpt4 key购买 nike

我目前正在实现一个使用 JTable 来显示一些信息的程序。该表包含不超过 10 行(因此它很小)。

在开发过程中,我通常使用 -verbose:gc 选项运行程序。

如果我单击两列之间的线并继续向左移动,然后向右移动等等,我注意到会生成大量垃圾。 程序在我执行此操作时完全没有执行任何操作,因此没有其他潜在的垃圾来源。另外,如果我停止,垃圾收集器也会停止收集。

如果我继续调整这些列的大小一分钟左右,将生成大约 100MB+ 的垃圾,这看起来很多。

这不会影响我的程序运行方式,但它看起来很奇怪。为什么会这样?

编辑

这是一个 SSCCE:

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class JTableTest
{
public static void main (String[] args)
{
SwingUtilities.invokeLater (new Runnable ()
{
@Override public void run ()
{
JFrame frame = new JFrame ();
frame.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
frame.setLayout (null);
frame.setSize (700, 300);
frame.setResizable (false);

JTable table = new JTable ();
table.setAutoResizeMode (JTable.AUTO_RESIZE_ALL_COLUMNS);

String[] titles = { "Title 1", "Title 2", "Title 3", "Title 4", "Title 5" };

String[][] data = {
{ "Row 1, Column 1", "Row 1, Column 2", "Row 1, Column 3", "Row 1, Column 4", "Row 1, Column 5"},
{ "Row 2, Column 1", "Row 2, Column 2", "Row 2, Column 3", "Row 2, Column 4", "Row 2, Column 5"},
{ "Row 3, Column 1", "Row 3, Column 2", "Row 3, Column 3", "Row 3, Column 4", "Row 3, Column 5"},
{ "Row 4, Column 1", "Row 4, Column 2", "Row 4, Column 3", "Row 4, Column 4", "Row 4, Column 5"},
{ "Row 5, Column 1", "Row 5, Column 2", "Row 5, Column 3", "Row 5, Column 4", "Row 5, Column 5"}
};

table.setModel (new DefaultTableModel (data, titles)
{
@Override public boolean isCellEditable (int row, int column)
{
return false;
}
});

JScrollPane scrollpane = new JScrollPane (table);
scrollpane.setHorizontalScrollBarPolicy (ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollpane.setVerticalScrollBarPolicy (ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

scrollpane.setBounds (20, 20, 650, 250);
frame.add (scrollpane);

frame.setVisible (true);
}
});
}
}

使用 -verbose:gc 选项运行程序。运行时,在“Title x”和“Title y”(x != y) 之间单击并调整这些列的大小。按住鼠标并继续左右移动。您将在 stdout 上看到垃圾收集器在您执行此操作时正在收集垃圾。 (在我的系统上,它大约每分钟执行 10 次)。 如果/当您停止时,将不再收集垃圾。

最佳答案

它产生垃圾只是因为它可以。 Java 是一种垃圾收集语言,基本上它所做的一切都会产生垃圾。

当您按住并拖动该按钮时,java 会进行原始 Activity (即鼠标按钮状态、光标位置状态、时间等)并创建事件。然后它将事件流与旧的光标位置等进行比较,以检测程序是否真的想对该信息做任何事情。当您移动它时,Java 需要绘制线条、文件矩形、绘制文本等。

所有这些 Activity 都会留下一些东西,垃圾,最终需要收集起来。

闲置时,您的程序正在产生垃圾,很可能非常缓慢,因为内部计时器等会死亡并被回收。尝试使用 jconsole 程序观察堆,您会发现它随着时间的推移逐渐增加。

这是正常现象,无需担心。这是一项功能,而不是错误。

关于java - 为什么调整 JTable 列的大小会产生垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10073205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com