タイトルに言いたいことは書いてありますが、Javaアンチパターンの小話です。
finalize()
Objectクラスのfinalizeメソッドは、そのObjectに対する参照がなくなり
ガベージコレクタにより破棄対象として回収された時に実行されますよね。
そのfinalizeメソッドをオーバーライドして処理を書いていたから困ったものです。
処理が実行されたりされなかったり、いつ呼ばれるかもわからないなんてことになっていました。
Javaでやってはいけないこと – finalizeメソッドを使う | javalife
finalize メソッドを呼んでもオブジェクトは解放されません。以下ダメな例。
FinalizeTest.java
public class FinalizeTest {
public void execute() {
//データベース接続
openDatabase();
//SQL発行等の処理
・・・
}
@Override
protected void finalize() throws Throwable { //これを書いてはいけない
//データベース接続の解放
closeDatabase();
}
}
以下が正しい例。finalizeメソッドをオーバーライドするのではなく、処理が終わったら、接続を解放する。
FinalizeTest.java
public class FinalizeTest {
public void execute() {
try {
//データベース接続
openDatabase();
//SQL発行等・・・
・・・
} finally {
//データベース接続の解放
closeDatabase(); //OK
}
}
}
System.gc()
以下も、gcの誤った利用例について記載されています。
参考
IBMのWASはJVMやGCをどのように扱っているのか?
いずれも今更な内容なのですが OutOfMemoryError - Heapdump Javacore GarbageCollector 解析 と合わせてまとめ。
参考になればさいわいです。