3

Java の弱参照を理解するために、Java 言語仕様を調べる必要がありました。セクション 12.6 の次の部分は、私を困惑させます。

ファイナライズされていないオブジェクトでは、ファイナライザーが自動的に呼び出されたことはありません。ファイナライズされたオブジェクトのファイナライザーが自動的に呼び出されました。ファイナライズ可能なオブジェクトでは、ファイナライザーが自動的に呼び出されることはありませんが、Java 仮想マシンは最終的にそのファイナライザーを自動的に呼び出す可能性があります。

では、ファイナライズされていないオブジェクトとファイナライズ可能なオブジェクトの正式な違いは何ですか? 引用から、ファイナライズされていないオブジェクトとファイナライズ可能なオブジェクトが異なる場合、ファイナライズされていないオブジェクトの場合、JVM が最終的にそのファイナライザーを呼び出す可能性があるというのは事実ではないようです。少し混乱するか、まだ勉強する英語のセマンティクスがいくつかあります;)

Java 仕様のセクションへのリンク:ファイナライズの実装

4

3 に答える 3

5

答えは次の行にあるようです。

Java 仮想マシンは、未ファイナライズ オブジェクトがファイナライザーに到達可能または到達不能になったことを検出すると、そのオブジェクトにファイナライズ可能 (G、H) のラベルを付けることができます。

ファイナライズされていないオブジェクトは、まだファイナライズできません。それらは到達可能です。ファイナライズ可能なオブジェクトはファイナライズされる資格があるため、JVM は選択したときにそれを行うことができます。言い換えれば、「かもしれない」というのは、「起こるかもしれない」という意味だけでなく、「する許可を持っている」という意味でもあります。

于 2011-06-15T16:14:06.637 に答える
2

ファイナライズされていないオブジェクトとファイナライズ可能なオブジェクトの違いは、2 番目のファイナライザーは将来いつでも自動的に呼び出される可能性があるのに対し、ファイナライズされてないオブジェクトのファイナライザーは、オブジェクトが最初にファイナライズ可能になるまで自動的に呼び出されないことです。

  • ファイナライズされていないオブジェクトは、この状態で JVM によって自動的に呼び出されるファイナライザーを取得しません。
  • ファイナライズ可能なオブジェクトは、最終的に JVM によって自動的に呼び出されるファイナライザーを取得できます。
于 2011-06-15T16:13:33.977 に答える
1

GCが実行される、または呼び出されるという保証はありませんfinalize()。ある時点で発生する可能性が高いです。

オブジェクトへの強い参照がなくなった場合、ガベージコレクションを行うことができます。しばらくして、GCを実行し、オブジェクトをファイナライズキューに追加して、finalize()メソッドを呼び出します。メソッドが呼び出された後、それへの強い参照がまだない場合は、メソッドを削除できます。

于 2011-06-15T16:14:30.537 に答える