【发布时间】:2016-10-06 08:59:57
【问题描述】:
我明白了:
- 无效的本地引用比实际的 GC 收集更有用(它不会产生真正的区别)
- 静态引用引用的对象在 Classloader 自己收集之前是不合格的(因为它引用了 Class 对象,而后者又引用了静态变量)
当将对象的静态引用显式设置为 null 时,在幕后实际发生了什么?
最初存储在堆中的原始对象会发生什么?
【问题讨论】:
-
清空本地引用可以作为一个警告,即代码是由并不真正了解自己在做什么的人编写的。否则它没有任何优势。
-
Nullifying local references is more useful for readability than actual GC collection (it won't make a real difference)---它可以区分 OutOfMemoryError 和无错误。 -
一个常见的误解是认为当一个对象变得无法访问(也就是垃圾)时会发生一些事情。事实是对于普通对象什么都不会发生。内存管理通过复制或压缩 仍然可访问 对象来工作,因此仅包含垃圾的内存区域本身可以被视为空闲内存,而无需显式释放操作。
-
@Holger 谢谢,您的答案实际上是最有用的答案,可以更清楚地解释该过程。不知道为什么很少这样解释,因为这是 imo 最好的说明。
-
它通常被认为是一个实现细节(嗯,它是一个实现细节,但是是最广泛的实现的一个细节……)或者过于复杂而无法进行介绍。 This document 虽然已经过时,但很好地概述了不同的算法。