我正在用Java编写一个游戏,在通过Windows任务管理器监视它一段时间之后,我注意到了一些内存泄漏,因为每次重新加载一个级别时,使用的内存都会增加2兆字节。在我的游戏代码中搜索了一段时间之后,我得出结论,内存泄漏是由我用来存储其他游戏对象(如敌人)的一些ArrayList对象创建的。
所以我创建了一个新的Java项目来运行一些测试。 让我们说我有一个名为Test
的课程public class Test
{
private int i;
public Test()
{
i = 0;
}
}
这是一个非常简单的类,只包含一个整数。所以我猜这样一个类的对象会占用大约4个字节的内存。
之后我创建了一个Test对象的数组列表,并用10.000个对象填充它。
ArrayList<Test> testList = new ArrayList<Test>();
for (int i=0;i<10000;i++)
{
testList.add(new Test());
}
这增加了我的内存使用量,正如我通过任务管理器注意到的那样,应该如此。 但问题是,即使我使用
清除整个数组列表testList.clear();
使用的内存仍然保持不变,让我们说40k。 我的问题是我如何设法解除我不再需要的arraylist中的项目?我知道java正在使用自动垃圾收集,并且为了使对象可以进行垃圾收集,必须没有从其他对象引用它,但我不明白为什么它不会释放那些Test对象。
即使我使用System.gc();似乎没有使用内存的差异。
答案 0 :(得分:0)
您获得的是JVM分配的内存,而不是实际的内存使用情况。
这是我用来监控实际内存使用情况的:
Assembly
每当调用垃圾收集器时,您应该会看到使用的内存缓慢上升并且会掉落