3
class StaticTest{

public static SomeClass statVar = new SomeClass();

}

在此之后,如果我们StaticTest.statVar随机访问和分配一些新对象,那么这些对象什么时候会被垃圾回收呢?答:在正常的垃圾收集时间。

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

不清楚?

好的,静态变量的生命周期是直到类卸载。在 Web 应用程序中,我们在静态上下文中初始化许多东西。如果我们为这个静态上下文提供了一些对象引用但我们没有释放它们,那么它是如何被垃圾收集的?

我很乐意就此进行讨论。

4

3 回答 3

5

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

于 2012-08-10T19:52:41.010 回答
0

静态对象引用通常被认为是 GC 根,并且它们指向的任何东西(以及被这些对象绑定的任何东西)都将被认为是活动的。如果您希望它们引用的对象成为垃圾回收的主题,您将需要清除对它们的引用(当然还有所有其他引用)。

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

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

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

于 2012-08-10T20:02:11.323 回答
0

考虑内存中的对象,而不是变量。statVar是对内存中某个对象的引用。如果您在其他地方保留对同一对象的引用,则在该引用被释放之前,该对象将不会被 GC。statVar类是否被卸载并消失并不重要,因为这只是对仍然有引用的 Object 的另一个引用。因此,在这种情况下将不会对其进行清洁。

于 2012-08-10T19:57:20.327 回答