Java:修复内存泄漏

时间:2013-11-02 21:53:12

标签: java memory memory-leaks garbage-collection

我的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();
}

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

System.gc()设置为mode后,您可以尝试添加对null的通话。

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

你也可以增加jvm可以使用的内存量上限,默认值为256mb。要做到这一点,你必须传入-Xmx 1024M(或类似的东西)。

希望这会有所帮助。