0

我注意到我创建的所有 Swing 应用程序似乎都在不断地分配新对象。

考虑这个小应用程序:

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings({ "javadoc", "serial" })
public class SwingTest extends JFrame {
    public static void main(String[] args) {
        new SwingTest().setVisible(true);
    }
    public SwingTest() {
        setTitle("SwingTest");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(400, 400));
        setContentPane(panel);
        pack();
    }
}

我不希望它消耗太多内存,但是如果我查看 VisualVM 中的堆图,我会看到内存使用量不断增加,然后重置。这是什么原因造成的?

4

2 回答 2

2

这是在我的机器上分析代码的结果(Linux 3.1.1 上的 OpenJDK 1.6.0_22 64 位,使用 Netbeans 分析器)

平面分析结果

我建议你找出那些分配的对象是什么。您可以通过制作内存快照并比较它们来做到这一点。

请注意,Netbeans 分析器与 VisualVM 的代码库相同。

于 2012-11-15T13:44:03.860 回答
1

阻止 Java 分配新对象,从而降低垃圾收集的成本,这违反了 Java 最初构建的主要原则之一。不,没有办法阻止 Swing 创建新对象 - 如果没有关键对象,它将如何运行?没有特殊的、无对象的操作模式。

如果垃圾收集的性能如此重要以至于您担心,那么 Java 不是您应该使用的技术。如果您的应用程序对时间要求很高,请用 C 或任何其他低级语言编写它,您可以在其中控制诸如内存管理性能之类的事情。

于 2012-11-15T12:51:18.597 回答