<分区>
我在分析器下运行我的应用程序,内存使用率比我预期的要高得多,其中对象在不再需要后仍然存在。它们中的大多数位于列表对象脱离上下文的列表中。
即使列表本身不再被引用,垃圾收集器是否需要更长的时间来释放位于列表中的对象?如果是这样,如果我在列表脱离上下文之前调用 clear() ,它们会更快释放吗?
谢谢 - 戴夫
<分区>
我在分析器下运行我的应用程序,内存使用率比我预期的要高得多,其中对象在不再需要后仍然存在。它们中的大多数位于列表对象脱离上下文的列表中。
即使列表本身不再被引用,垃圾收集器是否需要更长的时间来释放位于列表中的对象?如果是这样,如果我在列表脱离上下文之前调用 clear() ,它们会更快释放吗?
谢谢 - 戴夫
最佳答案
就垃圾回收机制而言,您问的是 GC 根 在被检测为不可访问时是否比所有其他可传递可访问对象具有任何优先级。考虑到标记-扫描算法的工作方式,这两者之间没有区别。所有此类垃圾对象都将在同一 channel 中进行标记,并且来自不可访问对象的对象的内部可达性对此没有影响。
发现大量无法访问的对象仍未被回收并不罕见,这实际上对整体应用程序性能有利:只有当内存分配失败时,GC 才会运行。如果您担心堆的大小,那么只需减小最大堆大小即可。这将导致更频繁的垃圾收集。
关于Java List.clear() 与 List = null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22635188/