Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态最终对象是否曾被垃圾收集器删除?_Java_Garbage Collection - Fatal编程技术网

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

Java 静态最终对象是否曾被垃圾收集器删除?,java,garbage-collection,Java,Garbage Collection,我以前在Java服务中使用过自定义对象,该服务始终在后端运行,有时我会收到错误报告,跟踪显示对象被垃圾收集器销毁时出现NULL\u POINTER\u EXCEPTION。由于我拥有所有高端设备,因此无法测试静态最终对象是否被垃圾收集器破坏?JVM使用标记扫描GC算法,该算法必须检查GC“根”位置中的所有活动引用(如当前调用堆栈中的所有对象)。每个活动对象都被“标记”为活动对象,活动对象引用的任何对象也被标记为活动对象 标记阶段完成后,GC扫描堆,释放所有未标记对象的内存(并压缩剩余活动对象的内

我以前在Java服务中使用过自定义对象,该服务始终在后端运行,有时我会收到错误报告,跟踪显示对象被垃圾收集器销毁时出现
NULL\u POINTER\u EXCEPTION
。由于我拥有所有高端设备,因此无法测试静态最终对象是否被垃圾收集器破坏?

JVM使用标记扫描GC算法,该算法必须检查GC“根”位置中的所有活动引用(如当前调用堆栈中的所有对象)。每个活动对象都被“标记”为活动对象,活动对象引用的任何对象也被标记为活动对象

标记阶段完成后,GC扫描堆,释放所有未标记对象的内存(并压缩剩余活动对象的内存)

我要说的是“不,'final'修改器不能帮助GC减少它的工作负载。”

在普通Java应用程序中(我不确定Android),静态最终引用对象只有在卸载其适当的类加载器时才被GCed

例如,当容器中有多个web应用程序(如Tomcat)时,取消部署每个web应用程序会卸载应用程序的类加载器,因此应用程序的静态最终引用对象将被GCed。但由其他类加载器加载的对象(如其他web应用的类加载器、通用类加载器、引导类加载器)不会被GCed

因此,您的问题的答案是:这取决于类加载器是否被取消激活

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

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

  • static
    加载类的类加载器变得不可访问。但这只能在代码达到某一点后发生,在该点上,任何人都不可能注意到对象是GC'd

  • 有人使用了“讨厌的反射技巧”将
    null
    分配给
    静态final
    。(是的,可以做到…)

  • 有些东西正在潜移默化地腐蚀堆;e、 g.一些错误的JNI/JNA代码

  • 注意,由于您(显然)正在观察被GC'd的对象的效果,因此它不能是类加载器被GC'd的直接结果。一定是发生了其他事情,使得类加载器和
    最终静态
    可以被GC'ed。。。如果这就是这里实际发生的事情


    实际上,我怀疑你的问题与GC无关。相反,我怀疑您的服务正在消亡,因为未记录未经检查的异常。非“main”线程上未捕获异常的默认行为是以静默方式忽略它们


    <>我建议您检查您的服务线程是否在使用< <代码> catch()/代码> <代码> >代码>方法中,或者在“未处理的异常处理程序”中记录所有异常。

    为什么您有标签C++和C??您忘记了Visual Basic标签…“自定义对象服务”,“高端设备”-这是什么平台?这就是Android JVM吗?如果这是关于Android的,正如@Rup所建议的,测试这一点的方法是在运行你的应用程序时清除RAM(这相当于Android在你喜欢的时候杀死你的进程)。我在我的应用程序中遇到了巨大的问题,因为我的静态对象意外地被破坏。@Rup是的,问题出在一个Android应用程序上,但我相信这不是一个特定于Android的问题。