3

次のコード スニペットの実行中に"java.lang.OutOfMemoryError: Java heap space"例外が発生しました。8192MコマンドでJVM ヒープ サイズを設定しましたset JVM_ARGS="-Xms8192m -Xmx8192m"

    List<Integer> largeList = new ArrayList<>();

    Random rand = new Random();

    for(int i=0;i<Integer.MAX_VALUE/2;i++)
    {
        largeList.add(rand.nextInt(Integer.MAX_VALUE));
    }

私が設定したJVMヒープサイズは、配列を保持するのに十分な大きさだと思います。

4

3 に答える 3

8

AListはオブジェクトのみを保持できます。

Integerオブジェクトには、実際の値用に少なくとも 4 バイトが必要であり、さまざまなオブジェクト関連のオーバーヘッド用にある程度の量のバイトが必要です (JVM によって異なりますが、通常はオブジェクトごとに約 16 ~ 30 バイトです) 。

Integer.MAX_VALUE / 2約億です。したがって、データだけ (オブジェクトのオーバーヘッドなし) の場合、リストを格納するには 40 億バイトが必要になります。それは4GBです。したがって、オブジェクトのオーバーヘッドがわずか 4 バイトであったとしても (実行するのは非常に難しく、おそらく実行時にあまり効率的ではありません)、ヒープの 8 GB をすべて使い果たします (コードを実行するために必要なすべてのクラスには何も残りません)。 . ArrayListまた、これには、多くの参照を保持する必要がある (どの JVM とどの設定を使用するかによって、8 バイトまたは 4 バイトのいずれかになります) ために保持されるメモリも含まれていません。

いいえ、ほとんど十分なメモリを割り当てていません。

int実際に多くの値が必要な場合int[]は、それよりもメモリ効率が大幅に向上する を使用することを検討してintください。固定サイズの小さなオーバーヘッドで効率的に 4 バイトを使用します。

于 2018-06-26T09:31:50.263 に答える