1

以下の無限ループのコードを使用してみました

public class OOME_Collection {

    static List l = new ArrayList();
    static Long i= new Long(1) ;

    public static void main(String[] args) {
        while (true) {
            l.add(i);
            i++;
            System.out.println("size " + l.size());
        }

    }
}

最後の SOP は : サイズ 3310522 なぜ OOME エラーが発生せず、さらにヒープ サイズが 50 MB から 100 MB まで変動し続けるのか

4

2 に答える 2

0

システムの処理能力とメモリが高いため、メモリ消費量が 50 ~ 150MB の範囲で変化することがわかるため、GC がスペースを再利用しようと懸命に働いている可能性があります。

1000 個のオブジェクトを追加するのにかかった時間とカウントのグラフを作成できます。次に、グラフに定期的にいくつかの異常が見られる場合があります。これは、異常時に GC がスペースを再利用しようとしていると結論付ける場合があります。結論としては、あくまでも概算です。

于 2013-08-10T18:47:33.280 に答える
0

おそらく、ガベージ コレクターがその仕事をするのに十分な RAM があります。画面に何かを出力する前に項目を追加して、本当に大きくしてみてください (メッセージの表示は非常に遅いため、OOME を非常に長く待つことになります)。

...

public static void main(String[] args) {
        while (true) {
            for(int j=0;j<1000000;++j)
                l.add(i);
            i++;
            System.out.println("size " + l.size());
        }    
    }

...

これはうまくスローします:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2245)
    at java.util.Arrays.copyOf(Arrays.java:2219)
    at java.util.ArrayList.grow(ArrayList.java:213)
    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:187)
    at java.util.ArrayList.add(ArrayList.java:411)
    at test.Test.main(OOME.java:26)
Java Result: 1
于 2013-08-10T17:32:05.110 に答える