IBM WebSphere OutOfMemoryException
-
06-07-2019 - |
質問
多くの場合、IBM Websphere Application Server で OutOfMemoryException が発生しました。この例外は、アプリケーションがデータベースから巨大なデータを取得するために発生すると思います。そこで、すべてのクエリを制限し、1000 レコードを超えるデータを取得しないようにし、WAS の JVM を次のように設定します。
+ Verbose garbage collection
+ Maximum Heap size = 1024 (RAM on my server is 16 GB and now I already change to 8192)
+ Debug arguments = -Djava.compiler=NONE -Xdebug -Xnoagent
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7777
+ Generic JVM arguments = -Dsun.rmi.dgc.server.gcInterval=60000
-Dsun.rmi.dgc.client.gcInterval=60000 -Xdisableexplicitgc
-Dws.log=E:\WebApp\log -Dws.log.level=debug
(ws.log and ws.log.level are my properties)
そして私は見つけました ヒープダンプ, ジャワコア そして スナップ プロファイルフォルダー内のファイル 問題の原因について教えてもらえると思いますが、ヒープダンプ、javacore、およびスナップファイルの読み取り/使用方法がわかりません。
OutOfMemoryExceptionを防ぐ/回避/修正する方法を教えてください。ありがとう
解決
これに対する答えは、OutOfMemoryExceptionに関連付けられたメッセージに依存します。 -XX:MaxPermSize = ...を試して、256mなどの大きな値に設定することもできます。
また、どこかに再帰関数がある場合、スタックオーバーフローを引き起こす可能性があります。
可能であれば、例外に関連するメッセージを投稿してください。 Stacktraceも役立つ場合があります。
他のヒント
ヒープダンプファイルを確認する場合、IBMはそれらを分析するためのツールを提供していますこちら。
「思い出をありがとう」 JVM のメモリ使用に関する優れた記事です。この問題の分析に役立つ可能性があります...
おかげで ブルライザー このリンクについて
JProfilerなどのツールを使用してデバッグできるように、問題をローカルで再現してみてください。 OOMをローカルに強制できない場合でも、JProfilerでメモリが増加する可能性があります。次に、スナップショットを取り、ガベージコレクションされていないクラスを探します。これは正確な科学ではありませんが、IBMヒープダンプを調べるよりもはるかに簡単です。ただし、必要に応じて、ヒープダンプを調べる古い方法はHeapRootsを使用する方法でした。バージョンによって異なります。 IBM JDKの一部のバージョンでは圧縮に問題があることがわかっているため、十分なメモリがある場合でも、十分な大きさのフラグメントがないため、OOMを取得できます。
Hibernate / JPAを永続プロバイダーとして使用していると思いますか? 2次キャッシュを使用していますか?その場合、キャッシュから大きな結果セットを削除することを検討しましたか?
OutOfMemoryErrorの種類種類がわからない場合、質問に答えるのは困難です。 permgen
と heapspace
は、まったく異なる2つの獣です。
JBossでperm-genを数か月間追跡していましたが、その特定のタイプの問題は、Webアプリケーションをオンザフライでリロードするすべてのアプリケーションサーバーに一般的でした。この物語は、こちらで文書化されています。
これらのヒープダンプは... Eclipse MAT 。