GC静态对象引用null

时间:2016-10-06 08:59:58

标签: java garbage-collection

我理解:

  • 无效本地参考对于可读性比实际GC集合更有用(它不会产生真正的差异)
  • 静态引用引用的对象在Classloader自身被收集之前是不合格的(因为它引用了Class对象,而它又引用了静态变量)

在将对象的静态引用显式设置为null时,幕后实际发生了什么? 最初存储在堆中的原始对象会发生什么?

3 个答案:

答案 0 :(得分:1)

从对象的角度来看,对它的引用是来自静态字段还是来自其他地方并不重要。一旦没有更多的引用它就有资格进行垃圾收集。实际获取垃圾时,取决于它所在的对象池,以及正在使用的垃圾收集策略。

答案 1 :(得分:1)

“幕后”这两点之间没有显着差异。

不同的效果仅仅归因于参考文献本身的生命周期。一旦局部变量在方法中不再使用,或者一旦该方法退出,它就会超出范围。静态字段只要在类中存在就会保持存在,这在很多情况下与应用程序生存期一样长。

这意味着在大多数情况下,本地引用不太可能显着延长对象的生命周期(尽管有例外),而静态引用则会在对象本身短缺的情况下进行。

答案 2 :(得分:1)

  

取消本地引用对可读性更有用

如果你的意思是它使代码混乱并使其可读性降低,那么我同意。

  

......它不会产生真正的影响

我是一些罕见的情况,它可以有所作为。但是不要这样做,除非你完全确定它很重要(如果你觉得每百种方法不止一次这样做,那可能就错了)。

  

在将对象的静态引用显式设置为null时,幕后实际发生了什么?

没什么特别的。如果这是最后一个引用,则该对象符合GC的条件。但这与其他所有对象/引用相同。

  

最初存储在堆中的原始对象会发生什么?

什么都没有,因为它只是引用无效的引用。一天收集对象(如果它是最后一个引用),但是再次:没什么特别的。