Java GC静态对象引用为null

Java GC静态对象引用为null,java,garbage-collection,Java,Garbage Collection,我明白: 取消本地引用对于可读性比实际的GC集合更有用(这不会产生真正的区别) 静态引用引用的对象在类加载器自身被收集之前是不合格的(因为它引用类对象,而类对象又引用静态变量) 当将对象的静态引用显式设置为null时,在幕后会发生什么 最初存储在堆中的原始对象会发生什么变化 从对象的角度来看,对它的引用是来自静态场还是来自其他地方并不重要。一旦没有更多的引用,它就有资格进行垃圾收集。它实际获取垃圾回收的时间取决于它所在的对象池以及所使用的垃圾收集策略。从对象的角度来看,对它的引用是来自静态字

我明白:

  • 取消本地引用对于可读性比实际的GC集合更有用(这不会产生真正的区别)
  • 静态引用引用的对象在类加载器自身被收集之前是不合格的(因为它引用类对象,而类对象又引用静态变量)
当将对象的静态引用显式设置为null时,在幕后会发生什么
最初存储在堆中的原始对象会发生什么变化

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

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

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

不同的影响只是由于引用本身的生存期。局部变量一旦不再在方法中使用,或者最迟在方法退出时,就会超出范围。静态字段保持存在的时间与类保持的时间一样长,在许多情况下与应用程序生命周期一样长


这意味着,在大多数情况下,局部引用不太可能显著延长对象的生命周期(尽管存在例外),而静态引用则不太可能显著延长对象的生命周期(如果对象寿命较短)。

这两个“幕后”点之间没有显著差异

不同的影响只是由于引用本身的生存期。局部变量一旦不再在方法中使用,或者最迟在方法退出时,就会超出范围。静态字段保持存在的时间与类保持的时间一样长,在许多情况下与应用程序生命周期一样长

这意味着在大多数情况下,局部引用不太可能显著延长对象的生存期(尽管存在例外),而静态引用则不太可能显著延长对象的生存期(如果该对象不是短期的话)

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

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

。。。这不会有真正的区别

我知道一些罕见的情况,这会有所不同。但是不要这样做,除非你完全确定这是重要的(如果你想每一百种方法做一次以上,这可能是错误的)

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

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

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

什么都没有,因为它只是一个被取消的引用。对象有一天会被收集(如果它是最后一个引用的话),但同样:没有什么特别的

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

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

。。。这不会有真正的区别

我知道一些罕见的情况,这会有所不同。但是不要这样做,除非你完全确定这是重要的(如果你想每一百种方法做一次以上,这可能是错误的)

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

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

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


什么都没有,因为它只是一个被取消的引用。对象有一天会被收集(如果它是最后一个引用的话),但同样:没有什么特别的。

清空本地引用可以作为一个警告,表明代码是由不真正理解它们在做什么的人编写的。否则它就没有任何优势。
取消本地引用对于可读性比实际的GC集合更有用(它不会产生真正的区别)
——它可以区分OutOfMemoryError和Not error。一个常见的误解是,当对象变得不可访问时,会发生一些事情,又叫垃圾。事实是,普通物体不会发生任何事情。内存管理的工作原理是复制或压缩仍然可以访问的对象,这样只包含垃圾的内存区域本身就可以被视为空闲内存,而不需要显式的释放操作。@Holger谢谢,您的答案实际上是最有用的,可以更清楚地解释这个过程。不清楚为什么很少这样解释,因为这是imo最好的澄清。它通常被认为是一个实现细节(好吧,它是一个实现细节,但是最广泛实现的细节…),或者对于介绍来说太复杂了,虽然已经过时,但它很好地概述了不同的算法。取消本地引用可以作为一个警告,表明代码是由不真正理解它们在做什么的人编写的。否则它就没有任何优势。
取消本地引用对于可读性比实际的GC集合更有用(它不会产生真正的区别)
——它可以区分OutOfMemoryError和Not error。一个常见的误解是,当obj