我們正在運行一個小型的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