Java List.clear() vs. List = null
2022-09-03 07:15:08
我在探查器下运行我的应用程序,内存使用率比我预期的要高得多,其中对象在不再需要后仍然存在。它们中的大多数位于列表对象已脱离上下文的列表中。
垃圾回收器是否需要更长的时间才能释放列表中的对象,即使列表本身不再被引用?如果是这样,如果我在列表上调用clear()在它脱离上下文之前,它们会更快地释放吗?
谢谢 - 戴夫
我在探查器下运行我的应用程序,内存使用率比我预期的要高得多,其中对象在不再需要后仍然存在。它们中的大多数位于列表对象已脱离上下文的列表中。
垃圾回收器是否需要更长的时间才能释放列表中的对象,即使列表本身不再被引用?如果是这样,如果我在列表上调用clear()在它脱离上下文之前,它们会更快地释放吗?
谢谢 - 戴夫
就垃圾回收机制而言,您是在询问 GC 根在被检测为无法访问时是否优先于所有其他可传递的可访问对象。鉴于标记扫描算法的工作方式,这两者之间没有区别。所有此类垃圾对象都将在同一通道中标记,并且从无法访问的对象内部访问对象的内部可访问性对此没有影响。
发现大量无法访问的对象仍未被回收并不罕见,这实际上有利于整体应用程序性能:只有当内存分配失败时,GC 才会运行。如果您担心堆的大小,则只需减小最大堆大小即可。这将导致更频繁的垃圾回收。
如果我们以一个例子为例,该方法就是这样做的:ArrayList
clear()
public void clear() {
modCount++;
// Let gc do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
基本上,如果 List 和 List 的元素在代码中的其他任何位置都没有被引用,那么实际上没有必要调用(或者至少这样做不会获得任何好处)。您也不需要分配给 List 变量,因为它将在超出范围后的某个时间点被垃圾回收(同样,如果列表本身未在其他任何地方引用)。clear()
null
了解“标记和清除”垃圾回收算法的工作原理:http://wiki.c2.com/?MarkAndSweep