में रेल पर जेआरबी के साथ पर्मजेन समस्या को ट्रैक करें हम टोमकैट के तहत चल रहे रेल पर जेआरबीई लिखे गए एक छोटे से वेब एप्लिकेशन चला रहे हैं। हम एक स्प्रिंग बैक-एंड का उपयोग कर रहे हैं जिसे किसी अन्य उत्पादन वेब एप्लिकेशन के साथ साझा किया गया है। दुर्भाग्य से, हम PermGen समस्याओं में चलते रहते हैं।टॉमकैट
ओएस: उबंटू लिनक्स 2.6.24-24-सर्वर # 1 SMP x86_64 जीएनयू/लिनक्स जावा: 1.6.0_21 बिलाव: 6.0.28 JRuby: 1.5.0 रेल: 2.3.7
वर्तमान में हम Google, याहू और Baidu द्वारा क्रॉल हो रहे हैं, इसलिए साइट का उपयोग बढ़ रहा है। मैं जेकोनसोल के साथ टोमकैट की निगरानी कर रहा हूं और हमें निश्चित रूप से कक्षाओं की अत्यधिक संख्या में समस्या दिखाई दे रही है। जब टोमकैट लॉन्च होता है, तो हमारे पास लगभग 12,000 वर्ग लोड होते हैं। 8 घंटों के बाद, हमारे पास लगभग 75,000 वर्ग लोड होते हैं। पर्मगेन एक ही समय में 100 एमबी से 460 एमबी तक चला जाता है।
कक्षा अनलोडिंग काम कर रही है, लेकिन यह केवल उसी 8 घंटे की अवधि में ~ 500 कक्षाएं उतार दी गई है। पर्मजेन कभी इकट्ठा नहीं होता है।
हम बिलाव के लिए निम्नलिखित वीएम विकल्पों के साथ चला रहे हैं:
-Xms2048m -Xmx2048m -XX:MaxPermSize=512m -XX:PermSize=128m \
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:ParallelGCThreads=4 \
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
जाहिर है रिसाव किसी तरह का है। सवाल यह है कि कैसे? इस बारे में कोई सलाह है कि किसके लिए और किसके लिए ज़िम्मेदार है? मुझे आशा है कि यह हमारे हिस्से पर कुछ सचमुच मूर्खतापूर्ण गलती है, लेकिन मुझे यकीन नहीं है कि कहां से शुरू किया जाए।
किसी भी सलाह की सराहना की जाएगी।
संपादित
ऐसा लगता है कि हम एक नया हर एक आने वाली अनुरोध के लिए बनाया वर्ग देख रहे हैं।
संपादित 2
यह निश्चित रूप से JRuby से संबंधित है। जेकनसोल का उपयोग करके, मैंने कक्षा लोडर के लिए वर्बोज़ मोड सक्षम किया। यहाँ 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]72f2fd1158
0x00007f721d7d50d8 9 457520 0x00007f720431c958 dead org/jruby/util/[email protected]
4 उदाहरणों के लिए 75,000 कक्षाएं अभी भी मेरे लिए बहुत कुछ लगती हैं ... :) लेकिन मैं निश्चित रूप से कुछ और परीक्षण करूँगा। धन्यवाद! – organicveggie
जो चीज मुझसे चिंतित है वह यह है कि ऐसा लगता है कि हर नए अनुरोध से नई कक्षाएं बनती हैं जो कभी जारी नहीं होतीं। यह सिर्फ मुझे सही नहीं लगता है। मैं समझता हूं कि क्यों JRuby नई कक्षाएं बना रहा है, लेकिन मुझे समझ में नहीं आ रहा है कि वे क्यों साफ नहीं हो जाते हैं ... – organicveggie
मैं कैसे बता सकता हूं कि jruby.compile.mode = OFF सही तरीके से काम कर रहा है या नहीं? मैंने जोड़ा- djruby.compile.mode = catalina.sh में CATALINA_OPTS को बंद करें, टॉमकैट शुरू किया और साइट के खिलाफ एक वेबक्रॉलर लॉन्च किया। जेकोनसोल इंगित करता है कि कुल वर्ग गणना और कुल परमिट लगातार बढ़ रहा है। – organicveggie