我对包含静态成员的类实例的Java垃圾收集感到有点困惑:
有些帖子说不会收集包含静态引用的类型,其他人会说它会是。
我需要某个类实例(比如AA类)来共享对另一个类型的引用(它是一个SQL数据源):当第一次访问AA静态类成员时创建DS,而AA实例使用此在他们的方法中共享DS以获得连接。问题是:
在我看来,静态DS不应该被垃圾收集,因为它的类成员不是实例成员,而应该收集AA实例。无论如何,我想得到更有经验的java程序员的意见。
答案 0 :(得分:5)
静态引用不会阻止AA实例被垃圾回收。
如果不再引用静态数据源,则只会对其进行垃圾回收。例如。设置AA.DS = null后,可以收集原始数据源。 删除对所有AA实例的引用将无济于事,因为静态DS引用仍然存在。
这取决于您如何编码。这在设计上不是线程安全的。
答案 1 :(得分:3)
静态字段引用的对象只有在整个类符合GC条件时才有资格,只有在以下全部为真时才会发生这种情况:
ClassLoader
加载的所有其他类都符合GC Class
对象的引用。在一个常见的Web应用程序中,例如,在加载Web应用程序时不会卸载类,但是当从Web服务器中删除Web应用程序时应该卸载它们(尽管在这种情况下内存泄漏是未知的)。 / p>