1

私が取り組んできたかなり大きなプロジェクトをデバッグしています(ただし、最初は作成していませんでした)OutOfMemoryError。コードはファイルから大量のデータをロードしているため、これは一般的にまったく驚くべきことではありません。

しかし、私が混乱しているのは、プログラムのプロファイリングに VisualVM 1.3.4 を使用していて、動作に一貫性がないことです。私が実行したほとんどの場合、ヒープは徐々に約 2GB まで拡大し (コンピューターには 16GB の RAM が搭載されています。これは学術研究用です)、使用済みヒープがその下でどんどん高くなっていきます。2GB前後でクラッシュします。ただし、プログラムは時間の経過とともにそれ以上の情報を処理するわけではないため、わずか数分でヒープが 2GB に拡大することはありません。

ただし、約 30 秒後にヒープ サイズが 250MB で、約 100MB しか使用されていない状態で突然クラッシュすることがあります。java.lang.OutOfMemoryError: Java heap spaceヒープがいっぱいでない場合、どうすれば取得できますか?

編集:プログラムを実行するために Eclipse を使用しています。また、VisualVM プラグインを使用しているため、自動的に起動されます。また、Java 7 を使用しています。

4

5 に答える 5

2

VM 引数でアプリケーションを開始します-XX:+HeapDumpOnOutOfMemoryError

ヒープ ダンプを分析し、問題の原因を突き止めます。

Eclipse MATは、このような問題を見つけるための優れたツールです。

于 2012-08-09T13:48:50.120 に答える
1

アプリケーションがOutOfMemoryErrorでクラッシュする理由は少なくとも2つあります。

  1. Javaヒープは、処理する必要のあるデータ量に対して小さすぎます。次に、提案されたMateiとしてそれを増やすか、提案されたAjayとしてヒープダ​​ンプを分析することができます。

  2. アプリケーションがメモリリークします。これは、処理後に不要なデータをメモリに残すことを意味します。その場合、ヒープを増やしても長期的には役に立ちません。また、オプションは、ヒープダンプ分析(再度)またはPlumbrなどの特殊なメモリリーク検出ツールのいずれかです。

于 2012-08-13T14:27:12.230 に答える
1

JVMの最小および最大ヒープメモリを設定する必要があります

set JAVA_OPTS = "-Xms128m -Xmx256m"

そのようなものですが、2G、4Gなどのより大きな値があります

LE:ご存知のとおり、JVMにガベージコレクターを強制的に実行させることはできませんが(要求することはできますが)、参照をnullにすることで、一部のアイテムを削除するように説得する方法がいくつかあります。もう1つ注意すべき点は、遅延初期化される可能性のあるデータベースオブジェクトです。このエラーは、最大ヒープメモリを超えるオブジェクトを作成しようとすると表示される可能性があります。

別のアイデアは、何らかの遅延した理由で何らかのメソッドでOutOfMemoryErrorをプログラムでスローした遅延した開発者である可能性があります。コードのその部分に到達すると、それが得られます(プロジェクトを検索してください)

于 2012-08-09T14:14:56.127 に答える
1

クラッシュの原因は、OracleのJREではなくOpenJDKJREを使用したことが判明しました。このようにクラッシュするOpenJDKのバグが正確にはわかりませんが、OracleのJREに変更することで最終的に問題は解決しました。

(私は誰かが私の前にオープンソースの仕事に使っていたLinuxコンピューターを使っているのでOpenJDKを使っていました。彼にクラッシュについて話したとき、彼はそれが原因かもしれないと思っていました。彼は正しかったです。)

于 2012-08-15T14:16:36.033 に答える
1

大容量メモリをサポートしていない 32 ビットのオペレーティング システムをお持ちですか (Win では PAE、Linux では巨大なメモリ カーネルなど)? はいの場合、32 ビット システムでプロセスごとに 2GB のメモリ セグメント制限が発生する可能性があります。

回避策として、JVM パラメーター -Xss192k を設定してスレッドごとに 192kb のスタック領域を解放し、パラメーター -Xmx1024m を設定して 1GB を超えるヒープを使用しないようにしてください。

于 2013-10-29T10:41:35.180 に答える