0

ここで、Javaガベージコレクターに関していくつか質問があります。Java GC. GCまず、JVMの起動時に、バックグラウンドスレッドが常にバックグラウンドで実行されることについて理解したことを明確にしておきます。各オブジェクトには1つのfinalize()メソッドがあります。このメソッドは、オブジェクトが破棄される前にシステムリソースを解放するために使用されます。Javaの専門家によると、システムリソースを解放するためにリソースをfinalize()メソッドの下に置くべきではありません。GCがいつ実行されるかを確認できないためです。ただし、をGC呼び出すことで実行を要求できSystem.GC()ます。

だから今私の質問は、GCバックグラウンドスレッドは常にバックグラウンドで実行されるということです。さて、いつ実行されるかわからないとどうやって言うことができGCますか?このような発言"we dont know when the GC will call finalize() method " ですかそれはその意味ですか?それが彼らの意味するところなら、その仕事はGC何ですか?GC未使用の変数を見つけてメモリから削除する責任。その場合、なぜGCfinalize()メソッドも呼び出せないのですか?

4

2 に答える 2

2

では、GC がいつ実行されるかわからないとどのように言えますか?

GC の機能は、基盤となる OS とハードウェアに依存する複雑なアルゴリズムによって処理されます。特定の JVM バージョンについて話すと、他の JVM では有効にならないため、何とも言えません。ですから、それに頼らないほうがよいでしょう。

GCの仕事は何ですか。

GC は参照のないオブジェクトを見つけ (詳細については参照の型を読み取ります)、それらによって使用されたメモリを回収します。

その場合、GC が finalize() メソッドも呼び出せないのはなぜですか?

したがって、 finalize メソッドが呼び出されることは確かですが、いつになるかはわかりません。JVM で finalize() メソッドがいつ実行されるかを知っていても、他の JVM でいつ実行されるかはわかりません。そのため、ファイナライズ メソッドで非常に高価なリソースを処理すると、他の JVM でプログラムがクラッシュする可能性があります。

于 2012-06-28T06:31:43.150 に答える
0

finalize簡単に言えば、GC は不確定な時間に実行されるため、システム リソースの解放を に依存している場合、システム リソースはタイムリーに解放されません。システム リソースを保持しているオブジェクトのヒープ領域を GC が取得するのを待つのは意味がありません。ほとんどのプログラム ロジックは、使用されなくなったリソースを単に解放するように簡単に設計できるはずです。

やや関連するメモについて。JVM の初期バージョンが非常に遅くなる原因の 1 つは、finalize. finalizeしたがって、最新の JVM は可能な限り呼び出しをスキップします。したがって、に依存するfinalizeと、パフォーマンスに影響を与える可能性もあります。

于 2012-06-28T06:30:49.453 に答える