ガーベジコレクションがでオブジェクトが破棄される直前に処理を行うには、
finalizeメソッドをオーバーライドしてそのメソッドの中に処理を記述すればOKです。
1 2 3 4 5 6 7 8 |
public class MyClass { @Override protected void finalize() throws Throwable { //ここにガーベージコレクション直前に実行したい処理を記述する } } |
サンプルソース
例)オーバーライドしたfilnalizeメソッドが呼び出されるサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class Sample { public static void main(String args[]) { System.out.println("インスタンスを生成します。"); MyClass c = new MyClass(); System.out.println("インスタンスを解放します。"); c = null; System.out.println("ガーベージコレクションを強制的に実行します。"); System.gc(); } } |
1 2 3 4 5 6 7 8 |
public class MyClass { @Override protected void finalize() throws Throwable { System.out.println("ガベージコレクションが呼び出されました"); } } |
- 実行例
- インスタンスを生成します。 インスタンスを解放します。 ガーベージコレクションを強制的に実行します。 ガベージコレクションが呼び出されました
備考
- ガーベージコレクションを強制的に実行するには、「System.gc();」を実行します。
- ガーベージコレクションの実行タイミングは環境に左右されるため、finalizeがいつ実行されるタイミングは保証されません。
- なので、処理を行った後ののclose処理など必ず実行しなければならない処理はfinalizeに記述してはいけません。