web-dev-qa-db-ja.com

Tomcat6で繰り返し発生する「PermGen」

Tomcat6サーバーで「PermGen」エラーが発生し続けます。

どのアプリケーションが問題を引き起こしているのかはわかっていますが、なぜそうなっているのかわかりません。アプリケーションはMySQL5を使用しており、JDK6で実行されています。

特定のアプリケーションの根本的な問題を診断または分析するためのツール/提案はありますか?

ありがとう

19
Berek Bryan

PermGenは、クラス定義とインターン文字列プールを格納するために使用されます。あなたのコードはそれを埋めている可能性がありますが(それが不必要にインターンを呼び出す場合)、より可能性が高いのは、デフォルトがアプリケーションに対して小さすぎることです。

これは、TomcatがWARをデプロイするたびに、または開発環境で作業している場合はJSPを編集するたびに、新しいクラスをロードするためです。これらは最終的にクリーンアップされるはずですが、アクティブな開発環境では、古いインスタンスと新しいインスタンスの両方がロードされる期間があります。または、本番環境にいて大規模なWebアプリを使用している場合は、単により多くのスペースが必要になる可能性があります。

Permgenサイズを設定するには、-XX:MaxPermSize=SIZEを使用します

次のリンクが役立つ場合があります: チューニングGC (これは1.5エディションです)、 GC FAQ (1.4.2エディション)、 ホットスポットVMオプション (これは1.6だと思います)

25
kdgregory

次のJVMスイッチを試してください。

-XX:+UseConcMarkSweepGC
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled

Permgenスペースを-XX:MaxPermSizeで増やすと、問題が遅れるだけです。

このコメントを参照してください: 「Java.lang.OutOfMemoryError:PermGenspace」エラーの処理方法

それは間接的にこれらの2つの投稿を指摘しました: 問題解決策

13
opyate

これを試してください:Linuxマシンで

export Java_OPTS="-XX:PermSize=128m"

3
Ganesh Tripathi

アプリケーションに多くのJSPがあると思います。 Tomcatには、多くのJSPを使用してデプロイされたアプリケーションを再起動すると、Tomcatがこれらすべてのクラスを再コンパイルして再ロードするため、PermGenの問題が発生するという既知の問題があります。前の投稿で述べたようにサイズを大きくすると役立つはずです。

2
Faisal Feroz

-XX:MaxPermSizeを使用してpermgenスペースを増やすと、問題が遅れるだけであることに同意します。 permgenを増やしてみましたが、サーバーにさらに多くのリクエストを送信した後、同じエラーが発生し始めました。パフォーマンスが少し低下しますが、-XX:+ CMSClassUnloadingEnabledなどの追加のフラグが推奨されます。

2

Hibernateとspringを使用しているときにコードを変更した後にTomcatをリロードすると、多くのpermgenエラーが発生します。これは、logger/ehcacheインスタンスが適切にシャットダウンされていないことが原因だと思います。

1
Theresa Forster