3

在 android 中,对于 finally 块下的代码:

1548 finally {
1549                /*
1550                 * clean-up everything...
1551                 */
1552                synchronized (sGLThreadManager) {
1553                    stopEglSurfaceLocked();
1554                    stopEglContextLocked();
1555                }
1556            }

这是否意味着它将由“FinalizerDaemon”运行?

当 trace.txt 显示 FinalizerDaemon 正在等待 ReferenceQueue 时,这意味着什么?

  "FinalizerDaemon" daemon prio=5 tid=7 WAIT
  | group="system" sCount=1 dsCount=0 obj=0x419d0c60 self=0x50cf3650
  | sysTid=3933 nice=0 sched=0/0 cgrp=apps handle=1086157112
  | schedstat=( 0 0 0 ) utm=32 stm=9 core=1
  at java.lang.Object.wait(Native Method)
  - waiting on <0x416da5d0> (a java.lang.ref.ReferenceQueue)
  at java.lang.Object.wait(Object.java:401)
  at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:102)
  at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:73)
  at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:169)
  at java.lang.Thread.run(Thread.java:856)
4

2 回答 2

6

无论是否发生异常,finally 都会在 try catch 块的末尾执行。

FinalizerDaemon 与此无关。它与垃圾收集有关。

于 2013-02-12T19:53:09.037 回答
5

finally和终结器不相关。

finally是在try-块之后的代码块,无论-catch的结果如何,它都会运行。它通常是您可以找到重要的清理代码以防止资源泄漏的地方。trycatch

finalize()清理对象时,垃圾收集器可以运行终结器(对象的方法)。但是,您不能保证它们会运行,也不能以任何顺序运行,等等。

FinalizerDaemon 可能是一个正在运行finalize()方法的线程。在这种情况下,它听起来像是阻塞了 a ReferenceQueue,它将保存对有资格完成的对象的引用。

对于它的价值,这里没有特定于 Android 的行为。这只是 Java 行为。

于 2013-02-12T19:52:57.080 回答