私は次のコードを持っています:
public class MyOjbect {
public Integer z = 111;
@Override
protected void finalize() throws Throwable {
System.out.println("invoking GC in MyOjbect");
super.finalize();
}
}
public class GC {
private MyOjbect o;
private void doSomethingElse(MyOjbect obj) {
o = obj;
}
@SuppressWarnings("unused")
public void doSomething() throws InterruptedException {
System.out.println("Start");
MyOjbect o = new MyOjbect();
doSomethingElse(o);
o = new MyOjbect();
doSomethingElse(null);
System.gc();
// System.out.println("checking "+o.z);
}
public static void main(String[] args) throws InterruptedException {
GC gc = new GC();
gc.doSomething();
}
}
メソッドを実行した後、なぜ変数をGC
ガベージするのだろうか。変数でさえまだnullではありません。実際、後でコードをデバッグする と、null ではなくガベージになります。さらに、最後の行のコメントを外すと、GC は変数を出力し、その後 GC を呼び出します。o
doSomethingElse
o
o
doSomethingElse
GC
o.z
更新:ローカル変数がフィールドと同じ理由を尋ねる人のために、SCJPテスト試験から問題をそのままコピーしました