私が読んでいるこの記事を、私は本当に理解することはできませんファイナライズ可能オブジェクト(上書きオブジェクトどのようにfinalize
それを再利用することができます前に、方法は)少なくとも2つのGCサイクルを要します。
finalizeableオブジェクトを再利用することができます前に、それは(最良の場合には)少なくとも二つのガベージコレクションサイクルが必要です。
誰かがまた詳細に説明することができ、それはファイナライズ可能オブジェクトが再利用のために、複数のGCサイクルを取ることは可能ですか?
私の論理的な引数は、私たちがファイナライズメソッドをオーバーライドする場合、ランタイムは、(GCが呼び出すことができるので、ガベージコレクタで、このオブジェクトを登録する必要がありますということですfinalize
私はGCがすべてファイナライズ可能オブジェクトへの参照を持っているだろうと思いますこれは、このオブジェクトの)。そして、このために、GCがファイナライズ可能オブジェクトへの強い参照を保持する必要があります。その場合は、このオブジェクトは最初の場所でGCによって干拓の候補になりましたか?私はこの理論によって矛盾に達します。
PS:私はオーバーライドすることを理解してfinalize
推奨されるアプローチではなく、このメソッドは、Java 9で廃止されました。
あなたは、ガベージコレクタがファイナライズ可能オブジェクトへの参照を必要とすることで正しいです。オブジェクトはファイナライズの前にまだ到達可能であるかどうかを決定する際にもちろん、この特定の参照が考慮されてはいけません。これは、ガベージコレクタへのこの参照の性質についての特別な知識を意味します。
ガベージコレクタはオブジェクトがファイナライズの対象であると判断した場合、ファイナライザは、少なくとも長いファイナライザが実行されると、オブジェクトは再び強く到達可能となることを意味する、実行されます。そのファイナライズ後は、オブジェクトが再び到達不能になる必要があり、オブジェクトのメモリを再利用することができます前に、これは、検出されなければなりません。それは、少なくとも二つのガベージコレクションサイクルを取る理由です。
広く使用されているホットスポット/ OpenJDKの環境の場合(およびおそらくまたIBMのJVMで)の、これは特別のインスタンスを作成することによって実現され、非公共のサブクラスにおいてはReference
、Finalizer
右そのクラスオブジェクトは、非自明を有する場合finalize()
この方法は、作成されます。弱い&ソフト参照と同様際に参照先存在していない強い参照、これらの文献は、ガベージコレクタによってキューに入れられているが、ファイナライザスレッドがファイナライズのために再びそれを強く到達すること、オブジェクトを読み取ることができるように、彼らは、クリアされません。この時点で、Finalizer
それはとにかく普通のオブジェクトと同じように収集さになるだろうので、それへの特別な言及はもう存在しないので、参照先が到達不能になった次の時間で、クリアするだけでなく、もはや参照されていません。
そのクラスすなわち、「些細なファイナライザー」、持っているオブジェクトの場合finalize()
によって継承されたメソッドjava.lang.Object
または空のfinalize()
メソッドを、JVMが作成するショートカットを取ることはないだろうFinalizer
あなたが言うことができるので、最初の場所でインスタンスを作るこれらのオブジェクトを、彼らのファイナライザがすでに実行しなかったかのようにすべてのオブジェクトの大半は、最初から、振る舞います。