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-ブロックの後のコードのブロックです。通常、リソースのリークを防ぐための重要なクリーンアップ コードが見つかる場所です。catchtrycatch

ファイナライザー (オブジェクトのfinalize()メソッド) は、オブジェクトがクリーンアップされるときにガベージ コレクターによって実行できます。ただし、それらが実行されることや、任意の順序で実行されることなどは保証されません.

FinalizerDaemon は、finalize()メソッドを実行しているスレッドである可能性があります。この場合、ReferenceQueueファイナライズされる資格のあるオブジェクトへの参照を保持する でブロックしているように聞こえます。

それだけの価値はありますが、ここには Android 固有の動作はありません。これは単なる Java の動作です。

于 2013-02-12T19:52:57.080 に答える