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

Java 我的Swing应用程序是否正在分配冗余对象?,java,swing,memory-management,garbage-collection,jvm,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)

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


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


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

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


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

以下是在我的机器上分析代码的结果(在linux 3.1.1上使用Netbeans profiler,使用OpenJDK 1.6.02264位)

我建议您找出这些分配的对象是什么。您可以通过创建内存快照并进行比较来实现这一点


请注意,Netbeans profiler与VisualVM的代码库相同。

以下是在我的机器上评测代码的结果(在linux 3.1.1上使用Netbeans profiler,OpenJDK 1.6.02264位)

我建议您找出这些分配的对象是什么。您可以通过创建内存快照并进行比较来实现这一点


请注意,Netbeans profiler与VisualVM的代码库相同。

锯齿模式可能是由评测本身引起的。锯齿模式应该是由GC扫描死引用引起的。不,不是-请参阅抱歉,测量本身证实了正确的联系:-故事的寓意:当心你的工具,避免仓促下结论。Swing只是从堆的角度不断地分配额外的对象,这只是一个疯狂的假设。正在检查哪些对象是由谁分配的。。。反驳这个假设;-)锯齿形图案可能是由轮廓本身造成的。锯齿形图案应该是由GC扫描死引用引起的。不,不是-对不起,正确的链接是由测量本身引入的:-故事的寓意:当心你的工具,避免仓促下结论。Swing只是从堆的角度不断地分配额外的对象,这只是一个疯狂的假设。正在检查哪些对象是由谁分配的。。。反驳这个假设;-)使用对象池可以轻松避免创建冗余对象。托管内存不是浪费内存的借口。@user11171那么你到底有什么问题?你抱怨Swing创建了太多的对象?还是垃圾收集太慢了?或者两者都有?通过使用对象池可以轻松避免创建冗余对象。托管内存不是浪费内存的借口。@user11171那么你到底有什么问题?你抱怨Swing创建了太多的对象?还是垃圾收集太慢了?或者两者都有?