- ベストアンサー
Javaのガーベジコレクションについて。
javaのガーベジコレクションの対象となるタイミングがわからないので教えて下さい。 class Sample{ Sample gc; } class SampleMain{ public static void main(String[] args){ Sample gc1 = new Sample(); Sample gc2 = new Saample(); gc1.gc = gc2; gc2.gc = gc1; gc1 = null; gc2 = null; } }
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
最初にgc1に代入されたSampleのインスタンスをA、gc2に代入されたインスタンスをBと呼ぶことにします。 gc1=null;を実行した時点では Aはgc2.gcから指されている Bはgc2から指されている のでA、Bどちらとも回収の対象にはなりません。 gc2=null;を実行し終えるとAもBもローカル変数からの直接・間接の参照がなくなります。普通はこの時点で両者とも回収の対象になるでしょう。ただし、実際にGCが発生して回収されるかどうかは別の問題です。ゴミになったものを即刻回収しなければいけないという仕様ではないからです。 念のために書いておくと、AとBは互いに参照し合っているので、採用しているGCアルゴリズムによってはgc2=null;以降も回収の対象にならないかもしれません。そんなJava処理系があるかどうかは知りません。
お礼
丁寧に説明していただき、ありがとうございました。