12

Sun のサイトの Out Of Memory ヘルプを使用しました。と引用されているところ

メモリ不足: 要求された配列サイズが VM の制限を超えています

これは、アプリケーションがヒープ サイズより大きい配列を割り当てようとしたことを示します。たとえば、アプリケーションが 512MB の配列を割り当てようとしたが、最大ヒープ サイズが 256MB である場合、このエラーがスローされます。ほとんどの場合、問題は、ヒープ サイズが小さすぎるか、バグにより、アプリケーションが誤って巨大であると計算されたサイズの配列を作成しようとすることのいずれかである可能性があります。

これをシミュレートしようとしました

import java.util.ArrayList;
import java.util.List;

public class JavaTest {
    public static void main(String[] args){
        long[] ll = new long[64*1024*1024];
    }
}

私のマシンで

javac *.java;java -Xmx256m JavaTest

しかし、上記の行は生産しています

スレッド「メイン」の例外 java.lang.OutOfMemoryError: Java ヒープ領域
    JavaTest.main(JavaTest.java:7) で

私は何が欠けていますか?

更新: 私のJavaバージョンは

$java -バージョン
Java バージョン「1.6.0_15」
Java(TM) SE ランタイム環境 (ビルド 1.6.0_15-b03)
Java HotSpot(TM) Server VM (ビルド 14.1-b02、混合モード)
4

4 に答える 4

26

私のため

long[] l = new long[Integer.MAX_VALUE];

収量Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit

 

PS:テスト目的で例外を生成する必要がある場合は、自分自身で行うこともできthrow new OutOfMemoryError("Requested array size exceeds VM limit")ます。

于 2009-12-10T12:58:55.933 に答える
1

配列は連続ヒープ領域として割り当てられ、メモリはオブジェクトの割り当てとガベージ コレクションにより断片化される可能性があります。メモリ不足エラーは、配列を割り当てるためのメモリの固体ブロックが不足しているために発生します。-Xmx フラグを使用して明示的に JVM メモリを送信しましたか?

于 2009-12-10T12:39:56.853 に答える
0

たとえば、ArrayList を割り当てて、実行時のサイズを 2 倍にしてみてください。

于 2009-12-10T12:38:09.167 に答える
0

例を見るだけで、C++ アプリケーション間のブリッジである Java ネイティブ インターフェイスを使用しているときに発生するように見える問題があります。

java.lang.OutOfMemoryError: Java heap space純粋な Java アプリケーションを実行する場合、配列を割り当てるための標準的な手順は、例外をスローする配列減速で渡されたサイズ変数から必要なバイトを計算することです。

配列が JVM の外部で作成されると、この別の例外が生成されるように見えます。この異なる動作には技術的な理由があると確信しています。

この人が別のフォーラムで説明している問題を再現してみてください。

于 2009-12-10T13:12:56.677 に答える