2011-08-24 12 views
8

私のアプリケーションで悪名高いOutOfMemoryExceptionが発生しました。ヒープスペースの量を単に増やすのではなく、問題の内容を調べようとしましたが、アプリケーションから何らかのリークが発生しました。Javaヒープスペース - -Xmxはどのように正確に動作しますか?

JVMパラメータ-XXを追加しました.OutOfMemoryエラーが発生したときにヒープダンプを作成するHeapDumpOnOutOfMemoryErrorが追加されました。次に、異なるプロファイリングツールを使用して作成されたダンプファイルを分析しました。私はその後、-Xmxパラメータを使用してパターンを観察し始めました。

私が困惑したことは、次のとおりです。ダンプを解析すると、すべてのオブジェクトの合計サイズが、-Xmxパラメータを使用して設定した合計よりもずっと少ないことがわかりました。 たとえば、-Xmxを '2048m'に設定します。私がダンプファイルを分析すると、ヒープ上に合計400Mbのオブジェクトが見つかりました。私は2GBを見つけることを期待していた。何か不足していますか?

+0

あなたのOOMEが実際にヒープメモリを参照していることを確認しましたか? OOMEがスローされるいくつかの(比較的まれな)ケースがありますが、完全なヒープではありません。 –

+1

@ Joachim、JVM x86のスレッドが多すぎてOOM例外もクラッシュする – aalku

答えて

3

エラーメッセージを再読み込みします。メモリが不足しているメモリの種類がわかります。私はそれがPermGen空間であったと思います。 Permgenはクラス定義のために使用されます(とりわけ)。 -XXでPermGenのスペースを調整できます。MaxPermSize PermGenはヒープの一部ではないため、ヒープダンプには含まれません。

PermGenの詳細については、this answerを参照してください。

これが問題でない場合は、最初のヒープサイズ(-Xms)を最大値と同じに設定してみてください。これは、ヒープが成長しないことを意味し、何が起こっているのかを簡単に理解する必要があります。

jvisualvm(JDKの一部)を使用して、プログラムの実行中にメモリ使用率を調べることをお勧めします。

+0

興味深いかもしれません....はい、私が得たエラーはこれでした。これを知ろうとしています。結果と一緒に返信します。 – Kros

+0

-XX:MaxPermSizeを使用して以来、問題を抱えていました。私のアプリケーションの最新の変更により、例外を引き起こしていたしきい値を超えていると思います。ご協力いただきありがとうございます。 – Kros

5

現代のGCはヒープを別々のメモリ領域(若い/テナント/パーマネント世代)に分割するので、永続的な世代空間がメモリ不足エラーを完全に埋めるだけで十分です。さまざまなJVMコマンドラインオプションを使用して、異なる世代空間の比率を設定できます。

は、ここでは良い記事についてTuning Garbage Collection with the 5.0 Java[tm] Virtual Machine(私は、より最近のものを見つけることができませんでしたが、私は基本的にはまだ新しい仮想マシンに適用すると思います)です。

関連する問題