class StaticTest{
public static SomeClass statVar = new SomeClass();
}
在此之后,如果我们访问StaticTest.statVar
并在随机时间分配一些新的对象,然后当所有这些物体会收集垃圾? 答:在正常的垃圾收集时间。
但是,如果这个statVar
有一些实例变量(对象)的引用?
不清楚?
好吧,静态变量续航时间,直到类卸载。 在Web应用程序中,我们在静态上下文初始化很多东西。 柜面如果我们提供这个静态语境一些对象引用,但我们并没有将他们释放,那么它是如何被收集垃圾?
我会很乐意在此讨论。
通过静态变量引用的对象将在类卸载时被垃圾收集。 所以,什么都对象由静态参考引用不会GCed直到类卸载(因为总有一个可达引用堆对象)。
想想在内存中的对象,而不是变量。 statVar
是在存储器中的某些对象的引用。 如果保留一个参考对象相同的其他地方,那么对象将不会被GC'd直到参考被释放。 如果类被卸载并不要紧statVar
消失了,因为这只是一个参考仍然有生存的引用对象。 因此,它不会在这种情况下清洗。
静态对象的引用通常被认为GC根,无论它们指向(和任何由这些对象捆绑起来)将现场直播考虑。 如果你希望对象,他们指的是受垃圾收集你需要清除对它们引用(和所有其他的引用以及课程)的。
如果你的类不再被引用和您的JVM设置为收集未使用的类,thinksteep的回答适用。 我不认为我的呼吸等待那一刻。
只要你保持引用的答案的数据只是他们不会被清除。 这是该协议的最基础部分,当你有一个GC。
作为一个方面说明,我很少觉得这是一个好主意,让事情在web-app的静态背景下,除非它是一个单独的对象或者是由web应用程序的所有用户共享的东西。 在这种情况下,为什么你会希望它是,只要你的应用服务器运行清理? 它没有意义。