包含静态成员的类实例的垃圾收集

时间:2011-04-04 08:54:16

标签: java static garbage-collection

我对包含静态成员的类实例的Java垃圾收集感到有点困惑:

有些帖子说不会收集包含静态引用的类型,其他人会说它会是。

我需要某个类实例(比如AA类)来共享对另一个类型的引用(它是一个SQL数据源):当第一次访问AA静态类成员时创建DS,而AA实例使用此在他们的方法中共享DS以获得连接。问题是:

  1. 静态DS会阻止AA实例被垃圾回收吗?
  2. 如果我将AA实例置为空并且它被垃圾收集,那么DS也会是gc吗?
  3. 从AA moethods中获取此静态DS的连接是线程安全的吗?
  4. 在我看来,静态DS不应该被垃圾收集,因为它的类成员不是实例成员,而应该收集AA实例。无论如何,我想得到更有经验的java程序员的意见。

2 个答案:

答案 0 :(得分:5)

  1. 静态引用不会阻止AA实例被垃圾回收。

  2. 如果不再引用静态数据源,则只会对其进行垃圾回收。例如。设置AA.DS = null后,可以收集原始数据源。 删除对所有AA实例的引用将无济于事,因为静态DS引用仍然存在。

  3. 这取决于您如何编码。这在设计上不是线程安全的。

答案 1 :(得分:3)

静态字段引用的对象只有在整个类符合GC条件时才有资格,只有在以下全部为真时才会发生这种情况:

  • 不存在该类的实例
  • ClassLoader加载的所有其他类都符合GC
  • 的条件
  • 不存在对其Class对象的引用。

在一个常见的Web应用程序中,例如,在加载Web应用程序时不会卸载类,但是当从Web服务器中删除Web应用程序时应该卸载它们(尽管在这种情况下内存泄漏是未知的)。 / p>