1

在下面的代码中

List<SomeObject> someObjectList = new ArrayList<SomeObject>();

do {

    SomeObject someObject = new SomeObject();

    someObjectList.add(someObject);

} while(some condition is met);

我的问题

  1. someObject 什么时候会被抓取?
  2. 我在这里泄漏内存吗?
4

3 回答 3

4

someObject 什么时候会被抓取?

someObject 当它不再可达时将被 GCed。在提供的简单示例中,当发生以下任一情况时,可能会发生这种情况:

  • someObjectList不再可达
  • someObject被移除someObjectList(从而使其不再可达)

我在这里泄漏内存吗?

据我所知,您的代码中没有任何迹象表明内存泄漏。

于 2012-07-13T21:27:41.200 回答
2

someObject在您的循环退出之前不会被 GC 处理。这是否是内存泄漏还有待解释。如果您希望它在仍在迭代时被释放,那么您正在泄漏。如果不是,那么你不是。

于 2012-07-13T21:29:30.873 回答
0

someObject是一个局部变量,永远不会被垃圾收集。这someObject是堆栈或寄存器中的“东西”。局部变量本身不是 java 对象。

someObject暂时持有对 的实例的引用SomeObject。并且该引用存储在数组列表内的数组中。

SomeObject在没有其他对象持有对该实例的引用之后,该实例将被垃圾收集一段时间。

于 2012-07-13T21:31:46.797 回答