我的Swing应用程序是否分配冗余对象?

时间:2012-11-15 12:33:23

标签: java swing memory-management garbage-collection jvm

我注意到我创建的所有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中的堆图,我会看到内存使用量不断增加,然后重置。是什么原因造成的?

2 个答案:

答案 0 :(得分:2)

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

flat profiling result

我建议你找出那些分配的对象是什么。您可以通过制作内存快照并进行比较来实现此目的。

请注意,Netbeans探查器与VisualVM的代码库相同。

答案 1 :(得分:1)

防止Java分配新对象,因此垃圾收集成本较低,这与Java首先构建的主要原则之一相反。不,Swing无法阻止创建新对象 - 如果没有关键对象,它将如何运作?没有特殊的,无对象的操作模式。

如果垃圾收集的性能如此重要以至于您需要关注,那么Java就不是您应该使用的技术。如果您的应用程序对时间要求严格,请使用C或任何其他低级语言编写,您可以控制内存管理性能等。