2011-10-07 9 views
30

Hibernateとglassfishサーバーを使用してJava Webアプリケーションを実行しています。私はそれを数回展開した後には、PermGenスペースエラー - Glassfishサーバー

java.lang.OutOfMemoryError: PermGen space例外があります。

私の環境変数に-XX:MaxPermSize=128Mを試しましたが、動作しません。

+0

これはあなたが探しているものです:http://stackoverflow.com/questions/1996088/java-class-permgen-memory-leak-web-applications-generic-solution – Raedwald

答えて

37

これは、クラスローダのメモリリークです。アプリケーションを再デプロイするたびに、新しいクラスローダーが作成され、アプリケーションのすべてのクラスが再度ロードされます。これは、perm gen空間でメモリを消費します。

古いクラスローダーとロードされたすべてのクラスをガベージコレクトする必要があります。そうしないと、複数回デプロイした後、最終的にPermGenスペースOOMEに実行されます。これは、外部クラスローダによってロードされたオブジェクトが古いクラスローダによってロードされたオブジェクトへの参照を保持している場合には機能しません。 This articleは問題の説明をよくしてくれます。

一般に、クラスローダーのリークは分析が難しく、修正が難しい場合があります。 古いクラスローダーがガベージコレクションされない理由を調べるには、プロファイラを使用する必要があります。 JProfilerではヒープウォーカーを使用し、glassfishクラスローダオブジェクトを選択し、受信参照ビューを使用してガベージコレクタルートへのパスをチェックします。

クラスローダークラスは、org.apache.servlet.jasper.JasperLoaderと呼ばれます。ここでは、クラスローダがロードされたオブジェクトの実インスタンスによって保持される通常の状況のスクリーンショットを示します。あなたの状況では

enter image description here

、あなたは外のオブジェクトからの参照が表示されるはずです。 Webコンテナのクラスローダリークのもう1つの一般的な原因は、停止していないバックグラウンドスレッドです。たとえばGoogle Guiceは3.0にこのようなバグがあります。

(免責事項は:私の会社はJProfilerをを開発)(LinuxベースのOSで)この問題を解決するために

5

この問題は、繰り返しの展開で何度も発生します。私はこれに何度も直面しています。 GlassFishのバグのためにJIRAのリンクの下に参照してください:

http://java.net/jira/browse/GLASSFISH-587

+1

このバグレポートの年を見たことがありますか?! –

46

次の操作を行い

1)増加メモリ(この問題が頻繁に来ないように)によりますドメインを構成しています。

<jvm-options>-XX:MaxPermSize=

set it to higher value eg- 198m or 256m

2)は、それが実行されていたポートを解放するGlassFishのプロセスを殺す

/GlassFishの/ドメイン内のxml」/ドメイン1/configに

検索(私の場合は私の場合は8686でした) open terminal(LinuxベースのOS)とタイプ -

sudo netstat -npl | grep 8686

これは、(この場合は3452)、そのプロセスを殺すために...

tcp6 0 0 :::8686 :::* LISTEN 3452/java

次利用

kill -9 3452のようなものになります

今起動しようグラスフィッシュ、それは開始する必要があります。

+0

ありがとうございます!とても良い! –

9

Windowsを使用している場合は、タスクマネージャを使用してglassfishプロセス(java.exe * 32)を強制終了してから、サーバーを再起動してみてください。

+0

これは完璧です –

関連する問題