静态变量引用的对象的垃圾收集

class StaticTest{ public static SomeClass statVar = new SomeClass(); } 

在此之后,如果我们访问StaticTest.statVar并随机分配一些新对象,那么当所有这些对象都将被垃圾收集? 答:在正常的垃圾收集时间。

但是如果这个statVar引用了一些实例变量(对象)呢?

不清楚?

好的,静态变量的生命周期是在类卸载之前。 在Web应用程序中,我们在静态上下文中初始化很多东西。 如果我们提供对这个静态上下文的一些对象引用但是我们不发布它们,那么它是如何被垃圾收集的呢?

我很乐意就此进行讨论。

静态变量引用的对象将在类卸载时进行垃圾回收。 因此,静态引用引用的对象在类卸载之前不会被GC(因为堆中的对象始终存在可访问的引用)。

想想内存中的对象,而不是变量。 statVar是对内存中某个对象的引用。 如果您在其他位置保留对同一Object的引用,则在释放该引用之前,Object将不会进行GC。 如果类被卸载并且statVar消失也statVar ,因为这只是对仍然具有引用生命的Object的另一个引用。 因此,在这种情况下不会被清理。

静态对象引用通常被认为是GC根源,无论它们指向什么(以及被这些对象束缚的任何东西)都将被认为是实时的。 如果你想让他们引用的对象成为垃圾收集的主题,你需要清除对它们的引用(当然还有所有其他引用)。

如果不再引用您的类并且您的JVM设置为收集未使用的类,则thinksteep的答案适用。 我不会屏住呼吸等待那一刻。

只要您保留引用的数据,答案就是它们不会被清除。 当你有一个GC时,这是协议中最基本的部分。

作为旁注,我很少认为将内容保存在Web应用程序的静态上下文中是个好主意,除非它是单个对象或该Web应用程序的所有用户共享的内容。 在这种情况下,只要您的应用服务器正在运行,为什么还要清理它? 这没有意义。