お疲れ様です。
参照元PDF
https://software.fujitsu.com/jp/technical/interstage/apserver/guide/pdf/Finalizer-GC.pdf
上記PDFファイルに一通り目を通した後で、
結局何がどう違うのか理解できませんでした。
以下では、PDF内の引用をしています。
- ファイナライザ
世代別 GC を実装している Java VM においては、ファイナライザを持つオブジェクトが Old 領域に存
在することがあります。Old 領域に存在するオブジェクトは、ファイナライザ到達可能になっても、フル
GC が実行されるまで、ファイナライズ可能になりません。そのため、New 領域に対する GC が何度実行
されても、オブジェクトはファイナライズ可能になりません。つまり、ファイナライザは実行されません。
また、GC 処理の最中、ファイナライザは処理されません。そのため、ファイナライズ待ちリストに大
量のオブジェクトが存在する状態で GC が頻発した場合、いつまでもファイナライザが処理されないこと
もあり得ます。
- ガベージコレクション
Java VM がオブジェクトを管理するメモリ領
域(Java ヒープ領域)がいっぱいになると、Java VM は、GC 処理を実行します。GC 処理では、不要に
なったオブジェクトのメモリを開放し、ほかのオブジェクトによってメモリを使用できるようにします。
- デストラクタ
C++言語のデストラクタは、スタック上に作成されたオブジェクトが自動的に破棄される場合や、メモ
リ上に作成されたオブジェクトが delete 演算子によって明示的に破棄される場合に呼び出されます。つま
り、デストラクタを呼び出すタイミングをアプリケーションで制御可能です。
調べてみたところどれも”同じ意味”ではなく、
しっかりとした違いがあるようですが、密接な関わり合いがあるのは確かなようです。(あるいは似ている)
ただこのあたりの説明をPDFで読んだところでピンとくる物はありませんでした。
一応私なりにまとめると、
ファイナライザは容易に使わないこと。
GCの連続によってファイナライザ実行がされない場合がある。
GCはヒープ領域とやらが満タンになると、自動的に不要となったオブジェクトの解放を行う。
デストラクタはアプリケーションで制御可能
ってくらいです。
違いを明確に理解して使用している方は、
どのような点を要点として抑えていますか。
よろしくお願いします。
P.S.
teratailロゴがハロウィン仕様になっていますね。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。