Tomcat6サーバーで「PermGen」エラーが発生し続けます。
どのアプリケーションが問題を引き起こしているのかはわかっていますが、なぜそうなっているのかわかりません。アプリケーションはMySQL5を使用しており、JDK6で実行されています。
特定のアプリケーションの根本的な問題を診断または分析するためのツール/提案はありますか?
ありがとう
PermGenは、クラス定義とインターン文字列プールを格納するために使用されます。あなたのコードはそれを埋めている可能性がありますが(それが不必要にインターンを呼び出す場合)、より可能性が高いのは、デフォルトがアプリケーションに対して小さすぎることです。
これは、TomcatがWARをデプロイするたびに、または開発環境で作業している場合はJSPを編集するたびに、新しいクラスをロードするためです。これらは最終的にクリーンアップされるはずですが、アクティブな開発環境では、古いインスタンスと新しいインスタンスの両方がロードされる期間があります。または、本番環境にいて大規模なWebアプリを使用している場合は、単により多くのスペースが必要になる可能性があります。
Permgenサイズを設定するには、-XX:MaxPermSize=SIZE
を使用します
次のリンクが役立つ場合があります: チューニングGC (これは1.5エディションです)、 GC FAQ (1.4.2エディション)、 ホットスポットVMオプション (これは1.6だと思います)
次のJVMスイッチを試してください。
-XX:+UseConcMarkSweepGC
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
Permgenスペースを-XX:MaxPermSize
で増やすと、問題が遅れるだけです。
このコメントを参照してください: 「Java.lang.OutOfMemoryError:PermGenspace」エラーの処理方法
これを試してください:Linuxマシンで
export Java_OPTS="-XX:PermSize=128m"
アプリケーションに多くのJSPがあると思います。 Tomcatには、多くのJSPを使用してデプロイされたアプリケーションを再起動すると、Tomcatがこれらすべてのクラスを再コンパイルして再ロードするため、PermGenの問題が発生するという既知の問題があります。前の投稿で述べたようにサイズを大きくすると役立つはずです。
-XX:MaxPermSizeを使用してpermgenスペースを増やすと、問題が遅れるだけであることに同意します。 permgenを増やしてみましたが、サーバーにさらに多くのリクエストを送信した後、同じエラーが発生し始めました。パフォーマンスが少し低下しますが、-XX:+ CMSClassUnloadingEnabledなどの追加のフラグが推奨されます。
Hibernateとspringを使用しているときにコードを変更した後にTomcatをリロードすると、多くのpermgenエラーが発生します。これは、logger/ehcacheインスタンスが適切にシャットダウンされていないことが原因だと思います。