0

64 ビットの Windows Server 2003、Oracle 11G データベース、および Apache Tomcat 6.0 Web サーバーで Web アプリケーションを実行しています。

アプリケーションはライブ環境にあり、アプリケーションを使用している約 3000 人のユーザーが Java ヒープのメモリ不足エラーに遭遇しました。ヒープスペースを増やした後、解決しました。

ここでも同じ問題に直面しています。以下はエラー スタック トレースです。

スレッド "http-8080-10" での例外 java.lang.OutOfMemoryError: Java ヒープ スペース 2013 年 8 月 23 日 8:48:00 PM com.SessionClunt getActiveSessionsヒープ領域 スレッド "http-8080-4" での例外 スレッド "http-8080-7" での例外 java.lang.OutOfMemoryError: Java ヒープ領域

4

2 に答える 2

1

あなたの問題は、いくつかのことが原因である可能性があります(概念レベルで):

  • 同時ユーザーまたはユーザー セッションが多すぎる可能性があります。

  • 同時に処理しようとしているユーザー要求が多すぎる可能性があります。

  • (ある意味で) 大きすぎるリクエストを処理しようとしている可能性があります。

  • メモリ リークが発生している可能性があります。これは、上記の問題の一部に関連している場合もあれば、無関係である場合もあります。

簡単な解決策はありません。(唯一の簡単な解決策を試しました...ヒープサイズを増やします...そしてうまくいきませんでした。)

これを解決するための最初のステップは、JVM オプションを変更して、OOME が発生したときにヒープ ダンプを取得するようにすることです。次に、メモリ ダンプ アナライザーを使用してダンプを調べ、メモリを使いすぎているオブジェクトを特定します。これにより、考えられる原因を絞り込むことができるいくつかの証拠が得られるはずです...

于 2013-08-24T05:25:56.810 に答える
0

OutOfMemoryError最大ヒープをどれだけ増やしても取得し続ける場合は、アプリケーションにメモリ リークが発生している可能性があります。これは、コードを調べて最適化することで解決する必要があります。それ以外には、できるまで最大ヒープを増やし続ける以外に選択肢はありません。

次のような完全に無料のツールを使用して、メモリ リークを探して最適化できます。

  1. アプリケーションが大量のメモリを使用する場合、アプリケーションのヒープ ダンプを作成しますが、クラッシュする前に、それを使用して、コンテナー (この場合は tomcat) で使用されるインストールjmapの一部を使用します。JavaJVM

    # if your process id is 1234
    jmap -dump:format=b,file=/var/tmp/dump.hprof 1234
    
  2. Eclipse メモリ アナライザー (MAT)を使用してヒープ ダンプを開く

  3. MAT は、潜在的なメモリ リークに関する提案を提供します。それらに従ってみてください。

  4. ヒストグラムタブを見てください。ダンプ時にメモリ内にあったすべてのオブジェクトが、クラスごとにグループ化されて表示されます。メモリ使用量とオブジェクト数で並べ替えることができます。メモリ リークが発生した場合、通常、明らかに意味をなさないいくつかのオブジェクトのインスタンスが驚くほど多すぎます。私はしばしば、その情報だけに基づいてメモリ リークを突き止めました。

もう 1 つの便利な無料のJVM監視ツールはVisualVMです。フリーではありませんが非常に強力なツールはJProfilerです。

于 2013-08-24T05:29:42.470 に答える