良いプログラマのJava 学習ルートが共有確定()メソッドの詳細な紹介を、確定()でオブジェクトの保護方法、サブクラスは、リソースのクリーンアップを達成するために、このメソッドをオーバーライドすることができGCをこの方法では、前のオブジェクトの回復に呼ばれています。。
確定的な役割を
(1)(確定)とC ++ デストラクタ関数が対応されていません。C ++ デストラクタ呼び出しのタイミングは、(オブジェクトがスコープ外になるか決定され、削除アウト)が、Javaがされてファイナライズ不確実と呼ばれます
(2)推奨されないファイナライズ①ローカルオブジェクトクリーンアップ:「非メモリリソース、」クリーンアップメソッドの完了を、しかしに推奨(経由JNIのオブジェクト作成し)、特定非メモリリソースを確保するように②; (などソケット等、ファイル、)サプリメントをリリース:でファイナライズ明示的にリソース解放の他のメソッドを呼び出します。この理由は、下に見ることができる[ファイナライズの問題
最終決定の問題を
(1)の一部ファイナライズ何らかの致命的な欠陥に関連する方法は、のように、放棄されたSystem.runFinalizersOnExit()メソッド、Runtime.runFinalizersOnExit()メソッド
(2)にSystem.gc()とは、System.runFinalization()メソッドが増加確定方法を実行する機会が、しかし、やみくもにそれらに依存しません
(3)は、Java 言語仕様は保証されませんファイナライズ方法は、タイムリーに実行され、それらが実行されることを保証するものではありません
(4)ファイナライズ方法は、パフォーマンス上の問題につながる可能性があります。ので、JVMは、通常、別個の低優先度のスレッドで行われ完成の実施を
(5)オブジェクトの再生:確定方法は、に割り当てられる回収することができるGCルーツ再生の目的を達成するために、基準までのオブジェクト
(6)確定方法をアップGCの実行時間(ユーザーが手動でオブジェクトの呼び出すことができますもちろんファイナライズ方法が、影響はありませんGCをする確定行動)
確定実装プロセスを(ライフサイクル)
(1) まず、一般説明ファイナライズ処理:オブジェクトとなる場合(GCルーツ)到達できない、GCは、オブジェクトがカバーするかどうかを決定するファイナライズ方法を覆われていない場合は、直接回収されるであろう。オブジェクトが実行されていない場合はそれ以外の場合は、ファイナライズに入れて、メソッドをF-キューキュー、キューオブジェクトは、低優先度のスレッドによって実行されたファイナライズ方法。実行ファイナライズ完了メソッドの後には、GCは、オブジェクトが届かない場合は、その後、到達します。それ以外の場合は、オブジェクトを再び回復できるかどうかを決定します「復活」。
(2) 具体的なファイナライズ処理:
オブジェクトは、2つの状態であってもよい、2つの状態空間は、状態空間の一端に関する F. = {、ファイナライズしていないファイナライズファイナライズ} 第到達可能な状態空間; R&LT = {到達可能、ファイナライザ、到達可能な、到達不可能ザ} 。それは以下の意味を述べています:
ファイナライズしていない: 最初にこの状態になります新しいオブジェクトは、GCは、その実行する準備ができていなかったファイナライズオブジェクトが到達可能であるため、この方法を
ファイナライズ: 示しGCは、オブジェクトに対して実行できるファイナライズ方法、GCは、オブジェクトが到達不能であることが検出されています。前述したように、GC によってF-キュー完了キューと専用スレッドファイナライズ実行
ファイナライズ: 表しGCは、オブジェクトに対して実行されたファイナライズ方法
到達可能: 表しGCのルーツ参照をアップ
到達可能-ファイナライザ(F-の到達可能)の:いない表現到達可能の、しかしによってファイナライズアップオブジェクト
到達不能:目的は、上記の二つの方法で到達できません
(1)第一のオブジェクトを作成し、[到達可能な、未確定] 状態(A)
(2)随着程序的运行,一些引用关系会消失,导致状态变迁,从reachable状态变迁到f-reachable(B, C, D)或unreachable(E, F)状态
(3)若JVM检测到处于unfinalized状态的对象变成f-reachable或unreachable,JVM会将其标记为finalizable状态(G,H)。若对象原处于[unreachable, unfinalized]状态,则同时将其标记为f-reachable(H)。
(4)在某个时刻,JVM取出某个finalizable对象,将其标记为finalized并在某个线程中执行其finalize方法。由于是在活动线程中引用了该对象,该对象将变迁到(reachable, finalized)状态(K或J)。该动作将影响某些其他对象从f-reachable状态重新回到reachable状态(L, M, N)
(5)处于finalizable状态的对象不能同时是unreahable的,由第4点可知,将对象finalizable对象标记为finalized时会由某个线程执行该对象的finalize方法,致使其变成reachable。这也是图中只有八个状态点的原因
(6)程序员手动调用finalize方法并不会影响到上述内部标记的变化,因此JVM只会至多调用finalize一次,即使该对象“复活”也是如此。程序员手动调用多少次不影响JVM的行为
(7)若JVM检测到finalized状态的对象变成unreachable,回收其内存(I)
(8)若对象并未覆盖finalize方法,JVM会进行优化,直接回收对象(O)
(9)注:System.runFinalizersOnExit()等方法可以使对象即使处于reachable状态,JVM仍对其执行finalize方法