Java内存释放

时间:2016-03-20 15:03:42

标签: java memory-leaks

我正在用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();似乎没有使用内存的差异。

1 个答案:

答案 0 :(得分:0)

您获得的是JVM分配的内存,而不是实际的内存使用情况。

这是我用来监控实际内存使用情况的:

Assembly

每当调用垃圾收集器时,您应该会看到使用的内存缓慢上升并且会掉落