Java:修复内存泄漏
我的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();
}
–但它不起作用。有没有其他方法可以解决这种类型的内存泄漏
# 1 楼答案
您可以在将
mode
设置为null
之后尝试添加对System.gc()
的调用您还可以尝试使用不同于默认值的垃圾收集器。为此,请在运行应用程序时传入
-XX:[Garbage collector]
(例如-XX:ConcMarkSweep
)。如果您在Eclipse中,则必须在项目配置中设置此参数(传递给JVM的参数)。有可用收集器的列表here您还可以增加jvm可以使用的内存量上限,默认值为256mb。要做到这一点,您必须输入-xmx1024M(或类似的东西)
希望这有帮助
# 2 楼答案
我不知道您是如何得出结论,您提供的代码导致内存泄漏的。使用一些探查器查看堆中当前有哪些对象,以及这些对象正在累积。您可以搜索探查器或检查以下内容: http://jyops.blogspot.se/2012/09/java-memory-model-simplified.html