在android中,对于finally块下的代码:
1548 finally {
1549 /*
1550 * clean-up everything...
1551 */
1552 synchronized (sGLThreadManager) {
1553 stopEglSurfaceLocked();
1554 stopEglContextLocked();
1555 }
1556 }
Run Code Online (Sandbox Code Playgroud)
这是否意味着它将由'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)
Run Code Online (Sandbox Code Playgroud)
finally 和终结者没有关系.
finally是一个代码块,在try- catch块之后,无论结果如何都会运行try- catch.通常情况下,您会找到关键的清理代码以防止资源泄漏.
finalize()清理对象时,垃圾收集器可以运行终结器(对象的方法).但是,你不能保证它们会运行,也不会以任何顺序运行,等等.
FinalizerDaemon可能是一个运行finalize()方法的线程.在这种情况下,它听起来像是阻塞了a ReferenceQueue,它将保留对有资格完成的对象的引用.
对于它的价值,这里没有特定于Android的行为; 这只是Java行为.
| 归档时间: |
|
| 查看次数: |
3852 次 |
| 最近记录: |