オブジェクト参照またはオブジェクトハンドルにはサイズ自体があり、サイズはJVMに依存することを知っています。明示的にnullに設定された後、どうなるのか疑問に思っています。変数がObject o = new Object()
あり、後で設定するとしo = null
ます。ガベージコレクションされますか?
3 に答える
あなたの例では:
Object o = new Object()
o = null;
o
フィールドまたはローカル変数/パラメータのいずれかであると想定します。前者の状況では、他の(外部)オブジェクトで4/8バイトを占有します。これらのバイトは、外部オブジェクトがガベージコレクションされるときにガベージコレクションされます。
がパラメータ/ローカル変数の場合o
、ガベージコレクションは必要ありません。JVMはスタックを「リサイクル」し、そのスペースを再利用/消去します。
参照はオブジェクトではなく、参照を含むオブジェクトを除いて、GCの対象ではありません。それらは字句スコープに住んでいて、同じ寿命を持っています。
オブジェクトへの参照が存在する間は、オブジェクトはガベージコレクションされません。オブジェクトを指すすべての参照がnullに設定されているか、他のオブジェクトを指すように設定されている場合、オブジェクトはガベージコレクションされる可能性がありますが、「それらの参照が参照するオブジェクト」ではなくなります。
JavaにはWeakReference
、オブジェクトへの参照を保持するように設計された、というクラスがあることに注意してください。これは、オブジェクトがガベージコレクションされるのを防ぐことはありません。システムがガベージコレクションを実行するときに、のターゲットであるオブジェクトが存在するが、それ以外の場合はガベージコレクションの対象WeakReference
となる場合、システムはを無効にしWeakReference
ます。その時点で、WeakReference
ターゲットが無効になる前に誰もターゲットを要求しなかった場合、オブジェクトへの参照はなくなり、収集の対象になります。