2016-07-15 5 views
2

私は、プリミティブ型の配列がjavaで暗黙的に0に初期化されていることを知っています。私はコードを持っている場合 だから:Javaのガベージコレクタがメモリを再利用するときは?

public class Foo{ 
    public static void main(String args[]){ 
     int[] arr = new int[50]; 
     for(int i = 0; i < 30; i++){ 
      arr[i] = i; 
     } 
     for(int i = 0; i < 30; i++){  // This Line 
      System.out.println(arr[i]); 
     } 
    } 
} 

を私が知りたい場合は、[30] ARRする[49]既にコメントがあるラインでガベージコレクタによって回収されていたであろうARRからメモリ?

+0

答えとして:まだ参照されているので、いいえ。たとえそうでなくても、開発者としてガベージコレクタの実行時に影響を与えることはできません。基本的には、環境がGCを実行する必要性を検出したときに実行されます。 – Stultuske

+2

プログラムが小さすぎて終了が早すぎます。ガベージコレクタは、このプログラムの実行時間内に決して実行されません。 – Robert

答えて

12

arr [30]からarr [49]までのメモリが、コメントがある行のガベージコレクタによって既に再利用されているかどうか知りたいですか?

いいえ、絶対にありません。配列は単一のオブジェクトです。それは到達可能であるか、到達可能ではありません...この場合、まだ到達可能です。

さらに複雑な例では、これがString[]の場合、要素arr[30]arr[49]で参照される文字列はガベージコレクションの対象になるとは思われません。非常にスマートなGC アレイのどの部分が未使用であり、GCルーツの部分を含まないかを知ることができるかもしれませんが、私はそれを見たことはないと思います。 (他のコードでは配列の参照は一度もなかったことを知っている必要がありますが、これは異常な状況に見えるため、おそらく最適化する価値がありません)。

2

No reclaimedそれでもまだ活発な参照があります。

一部のオブジェクトが使用されていないことをガベージコレクタが通知するとすぐに、削除対象としてマークされます。 (参照されたオブジェクトはまだそれへのポインタを持っています)。

削除のマークが付けられた後、ガベージコレクションの後のサイクルで実際のオブジェクトが削除されます。これにより、それらの場所に表示される空き容量が増えます。

オブジェクトが削除された後、残りの使用済みスペースは圧縮されます(したがって、すべての空きスペースは本質的に一緒になります)。

関連する問題