垃圾收集器是否会删除静态最终对象?

Qua*_*Ali 7 java garbage-collection

我以前在Java服务中使用了自定义对象,它始终在后端运行,我有时会收到Bug报告,其中的跟踪显示NULL_POINTER_EXCEPTION垃圾收集器已经破坏了对象.由于我拥有所有高端设备,我无法测试这是否会导致静态最终对象被垃圾收集器破坏?

Ami*_*deh 6

在普通的Java App中(我不确定Android),只有卸载了正确的ClassLoader时才会对静态的最终引用Object进行GCed.

例如,当在容器(例如Tomcat)中拥有多个web-apps时,取消部署每个web-app,重新启动应用程序的ClassLoader,因此应用程序的静态最终引用的Object将被GCed.但是其他ClassLoader加载的对象(例如其他web-app的ClassLoader,常见的ClassLoader,boot-strap ClassLoader)将不会被GCed.

所以你的问题的答案是:它取决于ClassLoader是否被取消激活.


Ste*_*n C 3

静态最终对象是否会被垃圾收集器删除?

我可以想到三种可能发生这种情况的情况:

  1. 使用 加载类的类加载器变得static无法访问。但这只会发生您的代码达到没有任何东西可能注意到该对象已被 GC 的程度之后!

  2. 有些东西使用了“令人讨厌的反射技巧”来分配nullstatic final. (是的,这是可以做到的......)

  3. 有些东西正在巧妙地破坏堆;例如一些有问题的 JNI / JNA 代码。

请注意,由于您(显然)正在观察对象被 GC 处理的效果,因此它不可能是类加载器被 GC 处理的直接结果。肯定发生了其他事情,使得类加载器和final staticGC 成为可能……如果这就是这里实际发生的情况。


实际上,我怀疑你的问题与GC无关。相反,我怀疑您的服务由于未记录的未经检查的异常而即将终止。除“main”之外的线程上未捕获的异常的默认行为是默默地忽略它们。

我建议您检查您的服务线程是否正在记录所有异常,无论是catchrun()方法中还是在“未捕获的异常处理程序”中。