【问题标题】:Is my Swing app allocating redundant objects?我的 Swing 应用程序是否分配了冗余对象?
【发布时间】:2012-11-04 01:24:20
【问题描述】:

我注意到我创建的所有 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 swing memory-management garbage-collection jvm


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 使用对象池可以轻松避免创建冗余对象。托管内存不是浪费内存的借口。
    • @user11171 那么你的问题到底是什么?您抱怨 Swing 创建了太多对象?还是垃圾收集太慢了?还是两者兼而有之?
    猜你喜欢
    • 1970-01-01
    • 2014-01-08
    • 2013-12-30
    • 1970-01-01
    • 2019-12-18
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多