到達不能なオブジェクトを見つけた後、JVM gc がそのオブジェクトの finalize() メソッドを実行することを読みました。次に、オブジェクトがまだ到達できないかどうかを確認し、そうでない場合は削除します。そこで、オブジェクトの参照を再び利用できるようにするファイナライズを作成しました。
public class Stuff {
List<Object> list;
public Stuff(List<Object> list) {
this.list = list;
}
@Override
protected void finalize() throws Throwable {
list.add(this);
System.out.println("A Stuff is finalized");
}
}
主な方法は次のとおりです。
public class Main {
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
list.add(new Stuff(list));
list.remove(0);
System.gc();
System.out.println(list.get(0));
}
}
「A stuff is finalized」が標準出力に表示されるため、gc が実行されますが、その後メインの printline で IndexOutOfBoundsException がスローされます。これを機能させることはできますか?
私は通常、ファイナライズをまったく使用しません。ファイナライズがオブジェクトの参照を再び利用可能にすることができるかどうかを確認するのは興味深いと思いました。これを機能させることはできますか?