我们正在运行一个小型的Web应用程序,它编写了在Tomcat下运行的JRuby on Rails。我们正在使用与其他生产Web应用程序共享的Spring后端。不幸的是,我们不断遇到PermGen的问题。在Tomcat中跟踪JRuby on Rails上的PermGen问题
操作系统: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和百度进行抓取,因此网站的使用情况已经提升。我一直在用JConsole监视Tomcat,并且我们肯定会看到类的数量过多的问题。当tomcat启动时,我们有大约12,000个类加载。 8小时后,我们有近75,000个课程加载。 PermGen在同一时间从100MB增加到460MB。
班级卸班正在工作,但它只在相同的8小时内卸载了500班。 PermGen似乎从未收集过。
我们用下面的VM选项为Tomcat运行:
-Xms2048m -Xmx2048m -XX:MaxPermSize=512m -XX:PermSize=128m \
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:ParallelGCThreads=4 \
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
显然有某种泄漏。问题在哪里?有关如何追查谁和对此负责的任何建议?我希望这是我们的一个非常愚蠢的错误,但我不确定从哪里开始。
任何意见将不胜感激。
编辑
它看起来像我们看到的每一个传入请求创建一个新的类。
EDIT 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
这似乎有点过分。大多数是三种类型的加载器之一: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/[email protected]
0x00007f721e51e2a0 57103 316038936 0x00007f720431c958 dead org/jruby/util/[email protected]
0x00007f72182f2b10 4 12944 0x00007f721d7f3030 dead org/jruby/util/[email protected]
0x00007f721d7d50d8 9 457520 0x00007f720431c958 dead org/jruby/util/[email protected]
对于4个实例,75,000个类仍然看起来很像我...... :)但是我肯定会做更多的测试。谢谢! – organicveggie 2010-07-16 18:59:46
关注我的事情是,它看起来每个新的请求都会创建永远不会发布的新类。这对我来说并不合适。我明白为什么JRuby会创建新类,但我不明白为什么他们不会清理干净...... – organicveggie 2010-07-16 19:05:53
如何判断jruby.compile.mode = OFF是否正常工作?我在catalina.sh中向CATALINA_OPTS添加了-Djruby.compile.mode = OFF,启动了tomcat并针对该网站启动了一个web爬网程序。 JConsole表明,班级总人数和总人数正在稳步上升。 – organicveggie 2010-07-16 20:43:34