Tomcatで実行されているJRubyonRailsで記述された小さなWebアプリケーションを実行しています。別の本番Webアプリケーションと共有されているSpringバックエンドを使用しています。残念ながら、PermGenの問題が発生し続けています。
OS:Ubuntu Linux 2.6.24-24-サーバー#1 SMP x86_64 GNU / Linux Java:1.6.0_21 Tomcat:6.0.28 JRuby:1.5.0 Rails:2.3.7
現在、Google、Yahoo、Baiduによってクロールされているため、サイトの使用率は上がっています。私はJConsoleを使用してTomcatを監視してきましたが、クラスの数が多すぎるという問題が確実に発生しています。tomcatが起動すると、約12,000のクラスがロードされます。8時間後、約75,000のクラスがロードされました。PermGenは同時に100MBから460MBになります。
クラスのアンロードは機能していますが、同じ8時間で約500クラスしかアンロードされませんでした。PermGenが収集されることはないようです。
Tomcat用に次のVMオプションを使用して実行しています。
-Xms2048m -Xmx2048m -XX:MaxPermSize=512m -XX:PermSize=128m \
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:ParallelGCThreads=4 \
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
明らかに、ある種のリークがあります。問題は、どのようにどこにあるのかということです。誰が、何がこれに責任があるのかを追跡する方法について何かアドバイスはありますか?それが私たちの側の本当にばかげた間違いであることを願っていますが、どこから始めればよいのかわかりません。
アドバイスをいただければ幸いです。
編集
着信リクエストごとに1つの新しいクラスが作成されているようです。
編集2
それは間違いなくJRubyに関連しています。JConsoleを使用して、クラスローダーの詳細モードを有効にしました。これがcatalina.outからのサンプルです:
[Loaded anon_class1275113147_895127379 from file:/opt/apache-tomcat-6.0.28/webapps/notes/WEB-INF/lib/jruby-core-1.5.0.jar]
[Loaded anon_class1354333392_895127376 from file:/opt/apache-tomcat-6.0.28/webapps/notes/WEB-INF/lib/jruby-core-1.5.0.jar]
[Loaded anon_class1402528430_895127373 from file:/opt/apache-tomcat-6.0.28/webapps/notes/WEB-INF/lib/jruby-core-1.5.0.jar]
したがって、問題は、これらの追加クラスの作成を担当する当事者をどのように追跡するかということです。
編集3
これが問題かどうかはわかりませんが、どういうわけか、クラスローダーの数が非常に多くなっています。走っjmap -permstat PID
て得た:
class_loader classes bytes parent_loader alive? type
total = 1320 135748 947431296 N/A alive=1, dead=1319 N/A
それは少し過剰に思えます。大部分は、、、またはの3種類のクラスローダーのsun.reflect.DelegatingClassLoader
いずれorg.jruby.util.JRubyClassLoader
かorg.jruby.util.ClassCache$OneShotClassLoader
です。繰り返しますが、からのサンプル出力jmap -permstat
:
class_loader classes bytes parent_loader alive? type
0x00007f71f4e93d58 1 3128 0x00007f71f4d54680 dead sun/reflect/DelegatingClassLoader@0x00007f72ef9a6dc0
0x00007f721e51e2a0 57103 316038936 0x00007f720431c958 dead org/jruby/util/JRubyClassLoader@0x00007f72f2fd1158
0x00007f72182f2b10 4 12944 0x00007f721d7f3030 dead org/jruby/util/JRubyClassLoader@0x00007f72f2fd1158
0x00007f721d7d50d8 9 457520 0x00007f720431c958 dead org/jruby/util/ClassCache$OneShotClassLoader@0x00007f72f3ce2368