2010-12-29 51 views
0

コードを書いていますが、サイズの異なるリストをいくつか渡したいのですが、リストのサイズが1024を超えると、例外がスローされます。どうすればそれを処理できますか?メモリ不足エラー

size, running time for x 

2,184073 
3,98308 
5,617257 
9,481714379 
17,55230 
33,64505 
65,41094 
129,65120 
257,102555 
513,197511 
1025,465897 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
     at OBSTclasses.MemoizedVersion.<init>(MemoizedVersion.java:33) 
     at OBSTclasses.Coordinator.main(Coordinator.java:102) 
Java Result: 1 

もこの例外をスローラインは次のとおりです。

 minAverageTimeArray = new double[array.size()][array.size()]; 

おかげ

+0

また、私はnetbeans IDE 6.7を使用しています – user472221

+0

これらの手がかりから、私はあなたのアルゴリズムの変更のheapsizeを増やす必要があることを伝えることができます。 – pinichi

答えて

3

あなたは、Java VMのヒープ領域を増やす必要があるでしょう、こちらを参照してください。http://hausheer.osola.com/docs/5

+0

それは私を助けてくれてありがとう! – user472221

2

それあなたのJavaプロセスが使用できる最大メモリ量を増やす必要があるように思えます。 java呼び出しに-Xmx512mのようなパラメータを追加します。ここで512mは512メガバイトを意味します。

3

malfy's answerには、メモリを少なくする方法を見つけること以外に、OutOfMemoryErrorが見つかると、JVMにヒープにさらに多くのメモリを割り当てるように指示することでヒープスペースを増やすことが状況を処理する1つの方法です。

通常、OutOfMemoryErrorのようなErrorに対してエラー処理を実行すべきではありません。 Exceptionとは対照的に、Errorは、JVMによってスローされる条件であり、JVMにとって致命的な問題が発生したことに気付きます。これは、プログラム自身が真に "処理"できないものです。 Java API Specification for the Errorクラスから

エラーが のアプリケーションでキャッチされる を試みるべきではない重大な問題を示すThrowable のサブクラスです。そのようなエラーのほとんどは、 の異常な状態です。

ので、簡潔に質問に答えるために、あなたはOutOfMemoryErrorをエラー処理であってもよいが、最初の場所で発生することErrorを回避するための方法を見つけるべきではありません。 OutOfMemoryエラーの

0

考えられる理由は
ソリューションをリークメモリが考えられます。coobirdはJavaでエラーを扱うことはありません言ったように、次のコマンド

Usage :: java -Xms<initial heap size> -Xmx<maximum heap size>
Defaults are:java -Xms32m -Xmx128m
Other values might be java -Xms128m -Xmx512m
-Xms - Initial Heap Size.
-Xmx - Extended(Maximum) Heap Size. m-megabytes

0

を使用して、ヒープサイズを増やし 。 MAT(Memory Analyzer - http://www.eclipse.org/mat/)を使用して、実際にメモリリークが発生していないか、ヒープメモリがJVMでないかどうかを確認できます。メモリリークの場合は、MATの結果を使用してメモリフットプリントを最適化することができます。そうでなければ、すでに多くの友人がヒープサイズを増やすことができます。

0

はい、あなたのヒープスペースは問題ありません。デフォルトでは、Javaはほとんどのプラットフォームでヒープに128MBを割り当てます。処理したいリストの最大サイズと、必要なメモリ量を考慮する必要があります。このように考えてみましょう。Javaのdouble型の変数は、通常8バイトです。リストの長さが1024アイテムの場合、2D配列には配列自体のために8 * 1024 * 1024バイト(8MB)のヒープスペースが必要です。あなたのリストの長さが2倍の場合、4倍のヒープ(32MB)が必要になります。また、2倍になると(4096アイテム)、ヒープスペースは128MB必要です。これはもちろん、プログラムによって作成された他のオブジェクトによって使用されるヒープをすべて無視します。

だから、いくつかの回答があります。他の人が言っているように、JVMインスタンスが使用する最大ヒープを増やす方が簡単です。また、いつでもプログラムが必要とするメモリ量を減らすことを検討する必要があります。すべてのデータを保存せずに計算できる中間集計または平均値はありますか?または、リストと配列の両方としてデータを格納する必要性を排除できますか?データの精度を下げることができますか?浮動小数点数や整数はアプリケーションの倍精度ほど正確ですか?