2009-12-10 6 views
8

Out Of Memory help from sun's siteを使用しました。それはOut Of Memoryをシミュレートする方法:要求された配列サイズがVM制限を超えています

Out Of Memory : Requested array size exceeds VM limit

This indicates that the application attempted to allocate an array that is larger than the heap size. For example, if an application tries to allocate an array of 512MB but the maximum heap size is 256MB, then this error will be thrown. In most cases the problem is likely to be either that the heap size is too small or that a bug results in the application attempting to create an array whose size is calculated to be incorrectly huge.

として引用されている場合、私は

javac *.java;java -Xmx256m JavaTest 

で私のマシンで

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

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

ことによって、これをシミュレートしようとしましたが、上記の行は

 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at JavaTest.main(JavaTest.java:7) 

何を生産しています私は行方不明ですか?

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

 
$java -version 
java version "1.6.0_15" 
Java(TM) SE Runtime Environment (build 1.6.0_15-b03) 
Java HotSpot(TM) Server VM (build 14.1-b02, mixed mode) 

答えて

18

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")自分。

+1

ありがとうございました。これも私のために働いています。しかし、私のコードはなぜ早く働かなかったのですか? – DKSRathore

+0

したがって、私のシステムは、1024 * 1024 * 1024-2からInteger.MAX_VALUEの範囲でこの例外を生成しています – DKSRathore

+1

@Adrian、VMの制限はどのように知っていますか? – DKSRathore

0

、たとえば、割り当てのArrayListを試してみて、そのサイズ、実行時間を倍増することです。

+1

この再び "メイン" java.lang.OutOfMemoryErrorをスレッドでの例外のように私を与えます(Arrays.java:2734)JavaTest.mainでjava.util.ArrayList.add(ArrayList.java:351) \tでjava.util.ArrayList.ensureCapacity(ArrayList.java:167) \t(JavaTestで \t。 java:27) – DKSRathore

1

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

+0

はい、私はしました。 javac * .java; java -Xmx1000m JavaTest – DKSRathore

0

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

純粋なJavaアプリケーションを実行するとき、標準的な手順では、アレイの減速で渡されたサイズ変数から必要なバイトを計算すると、java.lang.OutOfMemoryError: Java heap spaceの例外が発生します。

アレイがJVMの外部で作成されると、この別の例外が生成されます。私は、この異なる動作の技術的な理由があると確信しています。

この人がこのother forumで説明した問題を再現することができます。 Javaヒープスペースjava.util.Arrays.copyOf(Arrays.java:2760)で \t \t java.util.Arrays.copyOfで:

+0

答えをありがとう。しかし、フォーラムのリンクも、これがなぜ起こっているのか分からないのですか? VMの制限エラーは、VMメモリのネイティブメモリにもっと関係していますか? – DKSRathore