Java 静态最终对象是否曾被垃圾收集器删除?
我以前在Java服务中使用过自定义对象,该服务始终在后端运行,有时我会收到错误报告,跟踪显示对象被垃圾收集器销毁时出现Java 静态最终对象是否曾被垃圾收集器删除?,java,garbage-collection,Java,Garbage Collection,我以前在Java服务中使用过自定义对象,该服务始终在后端运行,有时我会收到错误报告,跟踪显示对象被垃圾收集器销毁时出现NULL\u POINTER\u EXCEPTION。由于我拥有所有高端设备,因此无法测试静态最终对象是否被垃圾收集器破坏?JVM使用标记扫描GC算法,该算法必须检查GC“根”位置中的所有活动引用(如当前调用堆栈中的所有对象)。每个活动对象都被“标记”为活动对象,活动对象引用的任何对象也被标记为活动对象 标记阶段完成后,GC扫描堆,释放所有未标记对象的内存(并压缩剩余活动对象的内
NULL\u POINTER\u EXCEPTION
。由于我拥有所有高端设备,因此无法测试静态最终对象是否被垃圾收集器破坏?JVM使用标记扫描GC算法,该算法必须检查GC“根”位置中的所有活动引用(如当前调用堆栈中的所有对象)。每个活动对象都被“标记”为活动对象,活动对象引用的任何对象也被标记为活动对象
标记阶段完成后,GC扫描堆,释放所有未标记对象的内存(并压缩剩余活动对象的内存)
我要说的是“不,'final'修改器不能帮助GC减少它的工作负载。”在普通Java应用程序中(我不确定Android),静态最终引用对象只有在卸载其适当的类加载器时才被GCed
例如,当容器中有多个web应用程序(如Tomcat)时,取消部署每个web应用程序会卸载应用程序的类加载器,因此应用程序的静态最终引用对象将被GCed。但由其他类加载器加载的对象(如其他web应用的类加载器、通用类加载器、引导类加载器)不会被GCed
因此,您的问题的答案是:这取决于类加载器是否被取消激活
静态最终对象是否曾被垃圾收集器删除
我能想到三种可能发生这种情况的情况:
static
加载类的类加载器变得不可访问。但这只能在代码达到某一点后发生,在该点上,任何人都不可能注意到对象是GC'dnull
分配给静态final
。(是的,可以做到…)最终静态
可以被GC'ed。。。如果这就是这里实际发生的事情
实际上,我怀疑你的问题与GC无关。相反,我怀疑您的服务正在消亡,因为未记录未经检查的异常。非“main”线程上未捕获异常的默认行为是以静默方式忽略它们
<>我建议您检查您的服务线程是否在使用< <代码> catch()/代码> <代码> >代码>方法中,或者在“未处理的异常处理程序”中记录所有异常。为什么您有标签C++和C??您忘记了Visual Basic标签…“自定义对象服务”,“高端设备”-这是什么平台?这就是Android JVM吗?如果这是关于Android的,正如@Rup所建议的,测试这一点的方法是在运行你的应用程序时清除RAM(这相当于Android在你喜欢的时候杀死你的进程)。我在我的应用程序中遇到了巨大的问题,因为我的静态对象意外地被破坏。@Rup是的,问题出在一个Android应用程序上,但我相信这不是一个特定于Android的问题。