ファイナライズ機能

転送元:https//blog.csdn.net/a4171175/article/details/90749839

Finalize()はObjectのメソッドです。これは、ガベージコレクターがオブジェクトによって占有されているメモリを再利用する前に呼び出されます。つまり、オブジェクトが仮想マシンによってデッドと宣言されると、最初にfinalize()メソッドを呼び出して、このオブジェクトにその存続期間の最後を処理させます。物事(この主題は、死の運命から逃れるためにこの機会を利用することができます)。この問題を理解するために、仮想マシンがオブジェクトがダムされていると判断する方法を見てみましょう。

 

死んだと判断された

「GCROOTS」の定義:GC管理の主な領域はJavaヒープであり、通常、ヒープ上でガベージコレクションのみが実行されます。メソッド領域、スタック、およびローカルメソッド領域はGCによって管理されないため、これらの領域のオブジェクトはGCルートとして選択され、GCルートによって参照されるオブジェクトはGCによって再利用されません。

「GCROOTS」もリファレンスチェーンのトップと見なすことができます。

Javaは、到達可能性分析アルゴリズムを使用して、オブジェクトが死んでいるかどうかを判断します。Javaは、一連の「GC Roots」オブジェクトを開始点として使用します。オブジェクトの参照チェーンを「GCRoots」オブジェクトまでさかのぼることができれば、世界は平和です。
それ以外の場合、Aオブジェクト参照のみがBを参照し、Bオブジェクト参照A、A、およびB参照チェーンがすべて「GCルート」を達成できる場合、それらは仮想マシンによって宣言され、死亡条件を満たすようになり、ガベージコレクターによってリサイクルされる資格があります。 。

 

最後の救い

死を判断する根拠は前述したが、死んだと判断された後も生き残る可能性はある。
自分自身を引き換える方法:
1。オブジェクトはfinalize()メソッドを上書きします(死刑を宣告された後にこのメソッドを呼び出し、最終的な引き換えを行う機会があります)
。2。finalize()メソッドで「GCRoots」を再参照します。 「チェーン上(現在のオブジェクトの参照thisをオブジェクトのクラス変数/メンバー変数に割り当てて到達可能な参照を再確立するなど)。


注意が必要です:


finalize()は、オブジェクトメモリが再利用される前に1回だけ呼び出されます(finalizeメソッドは、特定のオブジェクトに対してJava仮想マシンによって2回以上呼び出されることはありません)
。finalize()呼び出しには不確定な行があり、メソッドが呼び出されることを保証するだけです。 、ただし、メソッド内のタスクが実行される保証はありません(たとえば、手足が敏捷で顔をゆがめ、自助の過程でまだ殺されて回復しているオブジェクト)。

 

finalize()の役割


上記の例ではオブジェクトの救済を使用していますが、finalize()の関数は、最終的なリソースの回復に使用されると見なされることがよくあります。
自己救済のパフォーマンスに基づいて、この方法は多くの不確実性があり(方法のタスクが実行されることが保証されていない)、ランニングコストが高くなります。したがって、資源のリサイクルには向いていません。

要約すると、finalize()メソッドは役に立ちません。

そのような味のない方法がある理由については、この本には「C / C ++の破壊者ではなく、Javaが生まれたときにC / C ++プログラマーが受け入れやすくするための妥協案」と書かれています。

おすすめ

転載: blog.csdn.net/weichi7549/article/details/108571616