我的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();
}
- 但它不起作用。有没有其他方法可以解决这种类型的内存泄漏?
答案 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(或类似的东西)。
希望这会有所帮助。