2

我的 java 游戏应用程序中有内存泄漏,这是我所期待的。泄漏来自在此按钮操作侦听器上多次创建的新实例,因为每次按下按钮时,它都会创建一个新实例RegularMode

btnRegular.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        frame.remove(pane);
        gm = Gamemode.REGULAR;

        mode = new RegularMode(frame, WIDTH, HEIGHT);
    }
});

有趣的是,我一直在尝试使用以下代码修复内存泄漏:

public static void initDisplay() {
    gm = Gamemode.NONE;
    mode.setRunning(false);
    frame.remove(mode.getPane());
    frame.add(pane);
    frame.validate();
    frame.repaint();
    mode = null; // THIS LINE
    frame.pack();
}

——但它不起作用。有没有其他方法可以解决这种类型的内存泄漏?

4

2 回答 2

5

我不确定您是如何得出您提供的代码导致内存泄漏的结论的。使用一些分析器来查看当前在堆中和累积的对象。您可以搜索分析器或检查:http: //jyops.blogspot.se/2012/09/java-memory-model-simplified.html

于 2013-11-02T22:09:53.577 回答
0

您可以尝试System.gc()在设置mode为后添加对 的调用null

您也可以尝试使用与默认值不同的垃圾收集器。为此,请在运行您的应用程序时传入-XX:[Garbage collector](例如)。-XX:ConcMarkSweep如果您在 Eclipse 中,则必须在项目配置中进行设置(传递给 JVM 的参数)。这里有一个可用收集器的列表。

您还可以增加 jvm 可以使用的内存量上限,默认为 256mb。为此,您必须传入 -Xmx 1024M (或类似的东西)。

希望这可以帮助。

于 2013-11-02T22:10:56.583 回答