遇到这种情况,我们就需要从崩溃后台手机上的信息去分析产生的原因了 原理分析 Android在启动后会创建一些守护进程,其中涉及到该问题的有两个,分别是FinalizerDaemon和FinalizerWatchdogDaemon...FinalizerDaemon 析构守护线程。...对于重写了成员函数finalize的对象,它们被GC决定回收时,并没有马上被回收,而是被放入到一个队列中,等待FinalizerDaemon守护线程去调用它们的成员函数finalize,然后再被回收。...用来监控FinalizerDaemon线程的执行。一旦检测那些重写了finalize的对象在执行成员函数finalize时超出一定时间,那么就会退出VM。...如果是FinalizerDaemon进行对象析构时间超过了MAX_FINALIZE_NANOS(这里是10s),FinalizerWatchdogDaemon进行就会抛出TimeoutException
查阅了网上的资料才发现,通常这个错误发生在 java.lang.Daemons$FinalizerDaemon.doFinalize的方法中,直接原因是对象的 finalize() 方法执行超时。...FinalizerDaemon 析构守护线程 对于重写了成员函数finalize()的类,在对象创建时会新建一个 FinalizerReference 对象,这个对象封装了原对象。...FinalizerDaemon 线程循环取出链表里面的对象,执行它们的 finalize() 方法,并且清除和对应 FinalizerReference对象引用关系,对应的 FinalizerReference...FinalizerWatchdogDaemon 析构监护守护线程 析构监护守护线程用来监控 FinalizerDaemon 线程的执行,采用 Watchdog 计时器机制。...当 FinalizerDaemon 线程开始执行对象的 finalize() 方法时,FinalizerWatchdogDaemon 线程会启动一个计时器,当计时器时间到了之后,检测 FinalizerDaemon
在虚拟机启动时,会启动一系列守护线程,其中除了处理引用入队的 ReferenceQueueDaemon 线程,还包括执行 Finalizer 机制的 FinalizerDaemon 线程。...FinalizerDaemon 线程会轮询观察引用队列,并执行实际对象上的 finalize() 方法。...提示: FinalizerDaemon 是一个守护线程,因此 finalize() 的执行优先级低。...extends Daemon { private static final FinalizerDaemon INSTANCE = new FinalizerDaemon(); //...实际对象与 FinalizerReference 的关联关系依然会解除,否则会陷入死循环永远无法回收; 阶段 2 - FinalizerDaemon 执行 finalize() 方法: FinalizerDaemon
at java.lang.Daemons$FinalizerDaemon.doFinalize...at java.lang.Daemons$FinalizerDaemon.run
其实,在虚拟机启动时,会启动一系列守护线程,其中就包括处理引用入队的 ReferenceQueueDaemon 线程和 Finalizer 机制的 FinalizerDaemon 线程,这里唤醒的正是ReferenceQueueDaemon...// 启动四个守护线程: // ReferenceQueueDaemon:处理引用入队 ReferenceQueueDaemon.INSTANCE.start(); // FinalizerDaemon...:处理 Finalizer 机制 FinalizerDaemon.INSTANCE.start(); FinalizerWatchdogDaemon.INSTANCE.start();...随后,守护线程 FinalizerDaemon 会轮询观察引用队列,并执行实际对象上的 finalize() 方法。 更多内容分析,见 Finalizer 机制 ---- 4....引用对象会暂存到全局临时队列 unenqueued 队列; 2、守护线程 ReferenceQueueDaemon 会轮询 unenqueued 队列,将引用对象分别投递到关联的引用队列中; 3、守护线程 FinalizerDaemon
_a232 1807 1824 751 5092496 116012 0 0 S ReferenceQueueD u0_a232 1807 1825 751 5092496 116012 0 0 S FinalizerDaemon...futex_wait_queue_me 0 S ReferenceQueueD u0_a364 10435 10455 826 15418252 117992 futex_wait_queue_me 0 S FinalizerDaemon
u0a232 1807 1824 751 5092496 116012 0 0 S ReferenceQueueD u0a232 1807 1825 751 5092496 116012 0 0 S FinalizerDaemon...117992 futexwaitqueueme 0 S ReferenceQueueD u0a364 10435 10455 826 15418252 117992 futexwaitqueueme 0 S FinalizerDaemon
GraphicBuffer( 6339): register, handle(0x7f6e98bc80) (w:720 h:1280 s:720 f:0x1 u:0x000b00) I/System ( 6339): FinalizerDaemon
"ReferenceQueueDaemon" daemon prio=5 tid=3 Waiting "FinalizerDaemon" daemon prio=5 tid=4 Waiting "FinalizerWatchdogDaemon
XmlBlock.java:448) android.content.res.XmlBlock$Parser.finalize(XmlBlock.java:454) java.lang.Daemons$FinalizerDaemon.doFinalize...(Daemons.java:191) java.lang.Daemons$FinalizerDaemon.run(Daemons.java:174) java.lang.Thread.run(Thread.java
启动三个和GC相关的线程: public static void start() { ReferenceQueueDaemon.INSTANCE.start(); FinalizerDaemon.INSTANCE.start
我们先来分析下原因: 在VM GC的时候,为了减少程序的卡顿,会启动FinalizerWatchdogDaemon等四个守护线程,而FinalizerWatchdogDaemon的作用是用来监控FinalizerDaemon
syntheticException.setStackTrace(FinalizerDaemon.INSTANCE.getStackTrace()); // Send SIGQUIT
art(6305): art/runtime/runtime.cc:408] 12-07 10:37:10.710: A/art(6305): art/runtime/runtime.cc:408] "FinalizerDaemon...ReferenceQueue.java:209) 12-07 10:37:10.710: A/art(6305): art/runtime/runtime.cc:408] at java.lang.Daemons$FinalizerDaemon.run
打印结果如下: com.frank.protocdemo I/System: FinalizerDaemon: finalize objects = 1 com.frank.protocdemo I/System.out
threads count 412: 1820 com.sample.crashsdk 1844 ReferenceQueueD 1869 FinalizerDaemon 截图如下所示 图片图片 图片图片
HeapTaskDaemon.INSTANCE.stop();Java堆整理线程 / /ReferenceQueueDaemon.INSTANCE.stop(); 引用队列线程 // FinalizerDaemon.INSTANCE.stop...Zygote进程的4个Daemon子线程分别是ReferenceQueueDaemon、FinalizerDaemon、FinalizerWatchdogDaemon、HeapTaskDaemon,此处称为
threads count 412: 1820 com.xmamiga.crashsdk 1844 ReferenceQueueD 1869 FinalizerDaemon ... JNI。
领取专属 10元无门槛券
手把手带您无忧上云