不是web项目,纯java项目Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
学习是最好的投资!
私は @Founder の意見に同意しません。また、OOM が発生するとすぐにヒープ メモリのサイズを変更し始める人も多く、ヒープ メモリの調整は必ずしも大きいほど良いわけではありません。
まず第一に、知識を広めてください:
ヒープ メモリは、新しい世代と古い世代に分割されます。新しい世代は、頻繁に GC が必要な オブジェクトを格納するために使用されます。 各オブジェクト インスタンスには、一定期間を超えて GC が行われていない場合は、古い世代に昇格して保存されます。
旧世代のスペースは新世代よりも大きくなります。
OOM が発生すると、古い世代でメモリが不足します (新しい世代でメモリが不足すると、古い世代にメモリが配置されて保存されるため)。
次の方法で問題を分析して解決することをお勧めします:
1. コードを直接チェックして、コレクション内に無限ループや未解放の要素参照などのメモリ リークがないかどうかを確認します。
2. JVM パラメータ -XX:+HeapDumpOutOfMemoryError および -XX:HeapDumpPath=<你的path>
-XX:+HeapDumpOutOfMemoryError
-XX:HeapDumpPath=<你的path>
3. メモリ イメージ分析ツール (http://www.eclipse.org/mat/) を使用して、メモリ リーク または メモリ オーバーフロー が発生しているかどうかを分析します。次に、リークしたオブジェクトが GC ROOTS とどのように関連しているかを調べ、リークしたコードの場所を見つけます。
4. メモリ リークがない場合は、マシンの物理メモリを組み合わせて、ヒープ メモリ (-Xms および -Xmx) を増やし続けることができるかどうかを確認します。ヒープ メモリの設定は大きいほど良いことに注意してください。大きなメモリ上で FULL GC が発生すると、「stop the world」が長時間送信されるため、許容できません
簡単な解決策は、ヒープ サイズを調整することですEclilpse で起動パラメータを変更し、VM 引数に -Xms384m -Xmx384m を追加しますまたは Tomcat の catalina.bat - Xmx384m に -Xms384m を追加します
ただし、コードを再度確認することをお勧めします
@letcheng も彼の意見に同意します。あなたは Web プロジェクトではなく、単なる Java プロジェクトです。ヒープ上にオブジェクトをいくつ作成して OOM を引き起こすことができますか?したがって、これは主にコードによるものです。 JDK の下には、組み込みの JConsole.exe ツールがあり、現在存在するオブジェクトの数、ヒープ メモリの量、OOM がいつ発生したかを確認できます。
この種の問題の場合は、findbug や sonar などのツールを使用してプログラムを実行し、メモリ オーバーフローにつながるメモリ リークのリスクがある箇所を確認することをお勧めします。
java.lang.OutOfMemoryError: Java ヒープ領域は、メモリ領域が使い果たされたときにスローされます。したがって、この問題は主に、作成されたメモリが使用できないことが原因です。最も一般的な IO クラスなど、使用後に xx.close()
TOMCAT で大きなメモリを設定するだけでは十分ではありません。メモリ リークの問題が発生した場合、メモリがいくら大きくても役に立ちません。
私は @Founder の意見に同意しません。また、OOM が発生するとすぐにヒープ メモリのサイズを変更し始める人も多く、ヒープ メモリの調整は必ずしも大きいほど良いわけではありません。
まず第一に、知識を広めてください:
ヒープ メモリは、新しい世代と古い世代に分割されます。新しい世代は、頻繁に GC が必要な オブジェクトを格納するために使用されます。 各オブジェクト インスタンスには、一定期間を超えて GC が行われていない場合は、古い世代に昇格して保存されます。
旧世代のスペースは新世代よりも大きくなります。
OOM が発生すると、古い世代でメモリが不足します (新しい世代でメモリが不足すると、古い世代にメモリが配置されて保存されるため)。
次の方法で問題を分析して解決することをお勧めします:
1. コードを直接チェックして、コレクション内に無限ループや未解放の要素参照などのメモリ リークがないかどうかを確認します。
2. JVM パラメータ
を設定します。-XX:+HeapDumpOutOfMemoryError
および-XX:HeapDumpPath=<你的path>
3. メモリ イメージ分析ツール (http://www.eclipse.org/mat/) を使用して、メモリ リーク または メモリ オーバーフロー が発生しているかどうかを分析します。次に、リークしたオブジェクトが GC ROOTS とどのように関連しているかを調べ、リークしたコードの場所を見つけます。
4. メモリ リークがない場合は、マシンの物理メモリを組み合わせて、ヒープ メモリ (-Xms および -Xmx) を増やし続けることができるかどうかを確認します。ヒープ メモリの設定は大きいほど良いことに注意してください。大きなメモリ上で FULL GC が発生すると、「stop the world」が長時間送信されるため、許容できません
簡単な解決策は、ヒープ サイズを調整することです
Eclilpse で起動パラメータを変更し、VM 引数に -Xms384m -Xmx384m を追加します
または
Tomcat の catalina.bat - Xmx384m に -Xms384m を追加します
ただし、コードを再度確認することをお勧めします
@letcheng も彼の意見に同意します。あなたは Web プロジェクトではなく、単なる Java プロジェクトです。ヒープ上にオブジェクトをいくつ作成して OOM を引き起こすことができますか?したがって、これは主にコードによるものです。
JDK の下には、組み込みの JConsole.exe ツールがあり、現在存在するオブジェクトの数、ヒープ メモリの量、OOM がいつ発生したかを確認できます。
この種の問題の場合は、findbug や sonar などのツールを使用してプログラムを実行し、メモリ オーバーフローにつながるメモリ リークのリスクがある箇所を確認することをお勧めします。
java.lang.OutOfMemoryError: Java ヒープ領域は、メモリ領域が使い果たされたときにスローされます。したがって、この問題は主に、作成されたメモリが使用できないことが原因です。最も一般的な IO クラスなど、使用後に xx.close()
を実行しないでください。TOMCAT で大きなメモリを設定するだけでは十分ではありません。メモリ リークの問題が発生した場合、メモリがいくら大きくても役に立ちません。