2012-04-12 21 views
2

Spring + Hibernateを使用するWebアプリケーションで問題に直面しています。 WebアプリケーションはTomcatのjava.lang.OutOfMemoryError:GCオーバーヘッドの上限を超えましたSpring Hibernate Tomcat 6

で実行されているときにGCオーバーヘッドの制限が

を超えて、私はヒープダンプ取得しようとヒープ・ダンプの分析をした:

私はランダムエラー

java.lang.OutOfMemoryErrorをを取得していますここでのEclipse MAT

を使用して私の調査結果は、

オブジェクトですorg.hibernate.impl.SessionFactoryObjectFacこのオブジェクトのFashhashmapインスタンスは100,000以上のハッシュマップを保持しています。すべてのハッシュマップ内 org.hibernate.impl.SessionFactoryImplができるいくつかの回をロードしorg.hibernate.impl.SessionFactoryObjectFactoryのFashhashmap

内部に格納されているようだorg.hibernate.impl.SessionFactoryImpl、 のインスタンスがあります誰かがこの問題の根本原因を見つけるのを手伝って、これを解決するための解決策を提案します。

+2

SpringでHibernateをどのように設定するか、トランザクションやHibernateクエリの例をどのように管理するのかを教えてください。匿名化することができます。 –

答えて

1

SessionFactoryObjectFactory holds 86% of the memoryを取得していても、それは私にとっては問題には見えません。まず、メモリ解析ツールに頼る前に、まずこのツールがどのようにoutofmemoryの問題を予測しているかを理解する必要があります。 メモリツールは、一度そのツールを実行すると、アプリケーションに表示される即時HIKESをキャプチャしようとします。私はかなり同じエラーログを取得すると確信していますが、Catalina web class loaderが多量のメモリにアクセスしていることが明白で予想されるツールで言及されているさまざまな原因で発生しています。

このようなツール(特定の場合や実装では正しい)に頼るのではなく、アプリのソースコードを掘り下げて、不要な一時オブジェクトがどこにあるのかを見つけようとします作成した。

デバッグの目的で、正確にGCが収集しているものを表示するには、JVMオプション-をオンにすることができます。

詳細はこれらの記事/リファレンスを参照してください - http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#Options java.lang.OutOfMemoryError: GC overhead limit exceeded

0

さて、あなたのGCスレッドがオブジェクトをクリーンアップしようとしているプロセッサ時間の98%以上を費やしています。

ファクトリパターンの考え方は、作成するオブジェクトの非ヌルインスタンスを返すことです。通常、インスタンス化されてから同じインスタンスを返すことによって行われます。

これで100,000種類のセッションやその他のものがあるかもしれませんが、それが正しいとは思わないので、Factoryメソッド呼び出しが正しくダウンしていることを確認するコードをチェックする必要があります。キャッシュされます。

実際に100,000セッションがある場合は、セッションを作成しているメソッドをよく見てください。方法のローカル変数をスコープの外に一度きれいにすることができるように、長いメソッドを分割してループとwhile構造体をメソッド呼び出しで区切ります。

また、最適化手法として、最終的なメソッドをまとめて1つのスタックフレームにまとめるため、これらの小さなメソッドが最終的でないことを確認してください。

関連する問題