在下面的代码中
List<SomeObject> someObjectList = new ArrayList<SomeObject>();
do {
SomeObject someObject = new SomeObject();
someObjectList.add(someObject);
} while(some condition is met);
我的问题
- someObject 什么时候会被抓取?
- 我在这里泄漏内存吗?
在下面的代码中
List<SomeObject> someObjectList = new ArrayList<SomeObject>();
do {
SomeObject someObject = new SomeObject();
someObjectList.add(someObject);
} while(some condition is met);
我的问题
someObject 什么时候会被抓取?
someObject
当它不再可达时将被 GCed。在提供的简单示例中,当发生以下任一情况时,可能会发生这种情况:
someObjectList
不再可达someObject
被移除someObjectList
(从而使其不再可达)我在这里泄漏内存吗?
据我所知,您的代码中没有任何迹象表明内存泄漏。
someObject
在您的循环退出之前不会被 GC 处理。这是否是内存泄漏还有待解释。如果您希望它在仍在迭代时被释放,那么您正在泄漏。如果不是,那么你不是。
someObject
是一个局部变量,永远不会被垃圾收集。这someObject
是堆栈或寄存器中的“东西”。局部变量本身不是 java 对象。
someObject
暂时持有对 的实例的引用SomeObject
。并且该引用存储在数组列表内的数组中。
SomeObject
在没有其他对象持有对该实例的引用之后,该实例将被垃圾收集一段时间。