web-dev-qa-db-ja.com

Javaで「要求された配列サイズがVM制限)を超える」エラーを修正する方法

これをスローするだけでなく、Tomcatに不正なクエリを記録させるログオプションはありますか?

重大:Java.lang.OutOfMemoryError:要求された配列サイズがVM制限を超えています

(ログレベルをFULLにしようとしましたが、上記のみをキャプチャしました)

これは、さらにデバッグするには十分な情報ではありません
または、以下を微調整することにより、より多くのメモリを割り当てることでこれを修正できるか?

-Xms1024M -Xmx4096M -XX:MaxPermSize = 256M

更新

-Xms6G -Xmx6G -XX:MaxPermSize = 1G -XX:PermSize = 512M

(上記はうまくいくようです、監視を続けてください)

17
ajreal

Solrを新しいバージョンにアップグレードすると、この問題がソートされるようです。おそらく、新しいバージョンの方がヒープメモリ管理が優れています。

0
ajreal

大きなインデックスで並べ替えを使用している可能性があります。これは、Luceneで大きな配列サイズが必要になる可能性があることを私が間違いなく知っていることの1つです。どちらの方法でも、次のオプションを使用して64ビットJVMを試してみることをお勧めします。

-Xmx6G -XX:MaxPermSize=128M -XX:+UseCompressedOops

最後のオプションは、64ビットのメモリポインタを32ビットに減らします(ヒープが32GB未満である限り)。これにより、通常、メモリのオーバーヘッドが約40%削減されるため、メモリの大幅な拡張に役立ちます。

更新:おそらく、1Gではなく、それほど大きな永続的な世代サイズは必要ありません。おそらく128Mで大丈夫です。Java 6.で続行すると、特定のエラーが発生します。サーバーで8Gに制限されているため、回避できる可能性がありますより小さなperm genのヒープには7Gを使用します。スワップが発生しないように注意してください。これにより、Javaのパフォーマンスが大幅に低下する可能性があります。

私はあなたが-XX:+UseCompressedOops更新します。まだ試していない場合は、大きな違いが生じる可能性があります。エデンのサイズを小さくすることで、もう少し多くのスペースを絞り出せる可能性があります。それを超えると、必要なメモリが増えるか、並べ替えフィールドが少なくなると思います。

13
WhiteFang34

OutOfMemoryの原因を調べたい場合は、

-XX:+HeapDumpOnOutOfMemoryError 

Java opts。

次にメモリが不足すると、jdk/lib内にある「jhat」で分析できるヒープダンプファイルが表示されます。 Jhatは、ヒープに存在するオブジェクトとそれらが消費するメモリの量を示します。

5

Java VMsヒープ内のメモリの最大連続ブロックよりも大きい配列を作成しようとしているため、この例外が発生します。

https://plumbr.eu/outofmemoryerror/requested-array-size-exceeds-vm-limit

解決策は何ですか?

Java.lang.OutOfMemoryError:要求された配列サイズがVM制限を超えています。次のいずれかの状況の結果として表示される可能性があります。

配列が大きくなりすぎて、プラットフォームの制限とInteger.MAX_INTの間のサイズになる

制限を試すために、2 ^ 31-1要素より大きい配列を意図的に割り当てようとします。

最初のケースでは、コードベースをチェックして、本当にそれほど大きな配列が必要かどうかを確認します。たぶん、あなたは配列のサイズを減らしてそれで終わらせることができるでしょう。または、配列をより小さなバルクに分割し、プラットフォームの制限に適合するバッチで処理する必要があるデータをロードします。

2番目のケースでは、Java配列はintによってインデックス付けされることに注意してください。したがって、プラットフォーム内で標準のデータ構造を使用する場合、配列内の2 ^ 31-1要素を超えることはできません。実際、この場合、コンパイル中に「エラー:整数が大きすぎます」とアナウンスするコンパイラーによってすでにブロックされています。しかし、本当に大きなデータセットを実際に処理する場合は、オプションを再考する必要があります。処理する必要のあるデータをロードできます。小さいバッチでも標準のJavaツールを使用するか、標準のユーティリティを超える可能性があります。これを実現する1つの方法は、Sun.misc.Unsafeクラスを調べることです。これにより、 Cと同じように直接メモリ.

4
vaquar khan

これをcatalina.shで使用します

Java_OPTS="-Dsolr.solr.home=/etc/Tomcat6/solr -Djava.awt.headless=true -server -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"

30Mの小さなドキュメントで、Tomcat/solrでmemの問題が発生したことはありません。ただし、solrJインデックスクライアントに問題がありました。 Javaクライアントに-Xms8G -Xmx8Gを使用し、250K文書のチャンクで文書を追加する必要がありました。

0
Bob Yoplait

メモリ不足です!配列が範囲外であるかどうかを確認するか、ループしてシステムリソースを飲み込んでください。


  1. Java.lang.OutOfMemoryError:Javaヒープ領域JVMで、GCヒープサイズに98%の時間が利用可能で、この例外情報をスローする時間の2%未満の場合。JVMヒープ設定はJavaプログラムが実行中です。JVMメモリ領域を使用して設定を展開できます。起動時にJVMが自動的にヒープサイズ値を設定します。初期領域(つまり-Xms)は、 1/64、最大スペース(-Xmx)は1/4の物理メモリです。JVMを使用して-Xmn-Xms-Xmxを提供でき、他のオプションを設定できます。

  2. 要求されたアレイサイズがVM制限を超えています:これは、アレイサイズのアプリケーションがヒープスペースのサイズを超えているためです(512Mを適用するためにアレイ内の256Mのヒープスペースなど)。

0
nancyping