我注意到我创建的所有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中的堆图,我会看到内存使用量不断增加,然后重置。是什么原因造成的?
答案 0 :(得分:2)
以下是在我的机器上分析代码的结果(使用Netbeans分析器在Linux 3.1.1上使用OpenJDK 1.6.0_22 64位)
我建议你找出那些分配的对象是什么。您可以通过制作内存快照并进行比较来实现此目的。
请注意,Netbeans探查器与VisualVM的代码库相同。
答案 1 :(得分:1)
防止Java分配新对象,因此垃圾收集成本较低,这与Java首先构建的主要原则之一相反。不,Swing无法阻止创建新对象 - 如果没有关键对象,它将如何运作?没有特殊的,无对象的操作模式。
如果垃圾收集的性能如此重要以至于您需要关注,那么Java就不是您应该使用的技术。如果您的应用程序对时间要求严格,请使用C或任何其他低级语言编写,您可以控制内存管理性能等。