2012-05-24 12 views
5

मैं अपने JRuby आईआरबी सांत्वना ऊपर निकाल दिया और टाइप:JRuby - कचरा कलेक्टर कैसे शुरू करें?

irb(main):037:0* GC.enable 
(irb):37 warning: GC.enable does nothing on JRuby 
=> true 
irb(main):038:0> GC.start 
=> nil 
irb(main):039:0> 

मैं मैन्युअल को सक्रिय या एक कार्यक्रम के दौरान JVM कचरा शुरू कर सकते हैं?

मैं पूछता हूं क्योंकि मेरे पास एक ऐसा प्रोग्राम है जिसके बारे में 500 एमबीईटी परीक्षण डेटा उत्पन्न करने और इसे MySQL में सहेजने की आवश्यकता है। कार्यक्रम नेस्टेड लूप के लगभग 5 स्तरों का उपयोग करता है, और यह लगभग 100 एमबीटीई परीक्षण डेटा उत्पन्न करने के बाद एक जेवीएम मेमोरी हेप अपवाद के साथ दुर्घटनाग्रस्त हो जाता है क्योंकि वहां कोई और ढेर स्मृति नहीं है। मैं बाहरी लूप के हर भाग के बाद कचरा कलेक्टर चलाने देना चाहता हूं ताकि आंतरिक लूपों में बनाए गए सभी अनाथ वस्तुओं को साफ किया जा सके।

+1

यह मदद करने की संभावना नहीं है, क्योंकि यदि JVM स्मृति से बाहर हो जाता है, तो यह छोड़ने से पहले जीसी चलाएगा। आपको यह सुनिश्चित करने की आवश्यकता हो सकती है कि आप आवश्यकतानुसार संदर्भों को लंबे समय तक नहीं रख रहे हैं और/या ढेर आकार में वृद्धि कर रहे हैं। – theglauber

उत्तर

10

अपने प्रश्न का सटीक उत्तर होगा:

require 'java' 

java_import 'java.lang.System' 

# ... 

System.gc() 

हालांकि, ध्यान में रखते हुए भले ही JVM आमतौर पर जीसी चलाने करता है, यह या ऐसा नहीं हो सकता है - JVM पर बहुत निर्भर कार्यान्वयन। यह प्रदर्शन पर काफी हिट भी हो सकता है।

एक बेहतर उत्तर यह सुनिश्चित करने के लिए है कि नेस्टेड पाश के अंत में, आपके द्वारा उत्पन्न किए जा रहे परीक्षण डेटा पर कोई संदर्भ नहीं दिया गया है, ताकि उन्हें बाद में जीसी द्वारा पुनः दावा किया जा सके। उदाहरण:

class Foo; end 

sleep(5) 

ary = [] 
100_000.times { 100_000.times{ ary << Foo.new }; puts 'Done'; ary = [] } 

आप jruby -J-verbose:gc foo.rb के साथ इस चलाते हैं, तो आप जीसी नियमित रूप से वस्तुओं का दावा देखना चाहिए; यह JVisualVM का उपयोग करके भी स्पष्ट है (उदाहरण में sleep JVisualVM में Jruby प्रक्रिया से कनेक्ट करने के लिए कुछ समय देना है)।

आखिरकार आप निम्नलिखित ध्वज जोड़कर हीप मेमोरी बढ़ा सकते हैं: -J-Xmx256m; अधिक जानकारी के लिए the JRuby wiki देखें।

संपादित करें: संयोगवश, यहाँ a mindmap on GC tuning हाल ही में मैड्रिड DevOps निक फ्यूज द्वारा फिर से पोस्ट पर मारियो Camou द्वारा प्रस्तुत है।

+0

मेर्सी beaucoup सेबेस्टियन। आपके सुझाव बहुत उपयोगी थे और हमने विचार किए जाने से अधिक प्रश्न पूछने (और उत्तर देने) में हमारी सहायता की। –

+1

ईवर्नोट लिंक मृत प्रतीत होता है ... –

+0

उत्तर के लिए Thans। एक और उदाहरण: https://gist.github.com/Shobhit1/f4ec5c9f1f47f3b8e70bb7d27a78fba9 – shobhit1

-1

यह संभव नहीं है क्योंकि जीसी स्वचालित रूप से जेवीएम द्वारा चलाया जाएगा। सुनिश्चित करें कि आप केवल वही वस्तुएं बना रहे हैं जब इसकी आवश्यकता हो। वर्ग स्तर की वस्तुओं को बनाने से बचें और यह पता लगाने का प्रयास करें कि कौन सी वस्तुएं अधिक मेमोरी ले रही हैं और इसे आवश्यक होने पर ही बनाएं।

+0

यह सच नहीं है। आपके पास कुछ अच्छी सलाह है, लेकिन जीसी मैन्युअल रूप से चलाने के लिए संभव है। – Overbryd

संबंधित मुद्दे