class StaticTest{
public static SomeClass statVar = new SomeClass();
}
在此之后如果我们访问StaticTest.statVar
并随机分配一些新对象,那么当所有这些对象都被垃圾收集时?答:正常的垃圾收集时间。
但是如果这个statVar
引用了一些实例变量(对象)呢?
不清楚?
好的,静态变量的生命周期是在类卸载之前。在Web应用程序中,我们在静态上下文中初始化很多东西。如果我们提供对这个静态上下文的一些对象引用但是我们没有发布它们,那么它是如何被垃圾收集的呢?
我很乐意就此进行讨论。
答案 0 :(得分:4)
静态变量引用的对象将在类卸载时进行垃圾回收。因此,静态引用引用的对象在卸载类之前不会被GCed(因为堆中的对象始终存在可访问的引用)。
答案 1 :(得分:0)
考虑内存中的对象,而不是变量。 statVar
是对内存中某个对象的引用。如果在其他位置保留对同一Object的引用,则在释放该引用之前,Object将不会进行GC。如果类被卸载并且statVar
消失,则无关紧要,因为这只是对仍具有引用生命的Object的另一个引用。因此,在这种情况下不会被清理。
答案 2 :(得分:0)
静态对象引用通常被认为是GC根源,无论它们指向什么(以及被这些对象绑定的任何内容)都将被视为实时。如果您希望它们引用的对象成为垃圾收集的主题,您将需要清除它们的引用(当然还有所有其他引用)。
如果您的类不再被引用和您的JVM设置为收集未使用的类,则thinksteep的答案适用。我不会屏住呼吸等待那一刻。
只要您保留引用的数据,答案就是它们不会被清除。当你有一个GC时,这是协议中最基本的部分。
作为旁注,我很少认为将内容保存在Web应用程序的静态上下文中是个好主意,除非它是单个对象或该Web应用程序的所有用户共享的内容。在这种情况下,只要您的应用服务器正在运行,为什么还要清理它?这没有意义。