मेरे पास एक जावा क्लास है जो एक कस्टम क्लासलोडर के साथ गतिशील रूप से ग्रोवी क्लास को पुनः लोड कर रही है और मुझे कुछ कक्षाओं के साथ कुछ अजीब व्यवहार दिखाई नहीं दे रहा है, लेकिन समय के साथ यह रिसाव नहीं है स्मृति (उदाहरण के लिए परम जीन अनिश्चित काल तक नहीं बढ़ता है)।ग्रोवी क्लासेस एकत्र नहीं किए जा रहे हैं लेकिन स्मृति रिसाव के संकेत नहीं हैं
मेरी जावा कोड में मैं इतना (बॉयलरप्लेट सामान सादगी के लिए निकाला गया) की तरह वर्गों लोड हो रहा हूँ:
Class clazz = groovyClassLoader.loadClass(className, true, false, true);
instance = clazz.newInstance();
और मैं तो classloader कैश, metaregistry, आदि को साफ़ करके ग्रूवी कक्षाएं गतिशील फिर से लोड:
for (Class c : groovyClassLoader.getLoadedClasses()){
GroovySystem.getMetaClassRegistry().removeMetaClass(c);
}
groovyClassLoader.clearCache();
अब, अगर मैं सिर्फ इस कोड पर लूप करता हूं, तो लगातार लोड हो रहा हूं और फिर मेरी ग्रोवी कक्षाओं को फिर से लोड कर रहा हूं, मुझे अजीब व्यवहार दिखाई देता है (मेरा टेस्ट कोड सचमुच रीलोड प्रक्रिया पर लूपिंग कर रहा है - यह किसी भी के साथ कुछ भी नहीं कर रहा है वस्तुओं आदि बनाया, तो उदाहरण उपरोक्त कोड में केवल स्थानीय है इसलिए जीसी के लिए अच्छा होना चाहिए)।
तो मैं इसे चलाने के लिए, 128 के लिए maxpermsize की स्थापना तो मैं व्यवहार रिसाव हो और यह OOM त्रुटियों permgen:
हालांकि, अगर मैं इसे फिर से चलाने और 256M के लिए maxpermsize वृद्धि, तो सब है अच्छा और यह हमेशा के चला सकते हैं (इस छवि को 1 घंटा है, लेकिन मैं पुनः लोड के हजारों कर रात में इसे चलाने की है):
किसी को भी किसी भी समान व्यवहार के पार चलो गया है? या कोई विचार है? यह भी अजीब लगता है कि पहले उदाहरण में, स्मृति वृद्धि स्थिर वृद्धि के बजाय चरणों में कूद जाती है।
आपके 256 मीटर परम आरेख से पता चलता है कि आपके प्रोग्राम को चलाने के लिए 150 एम परम जीन की आवश्यकता है। मेरे ऐप में, मैं लीकिंग को रोकने के लिए gclovy को .class संकलित करता हूं। हालांकि, मेटाक्लासों ने भी बहुत सारे परमजन (लगभग 100 मीटर) – farmer1992
@ किसान 1 9 2 9 - हां लिया, लेकिन अगर मैं किसी भी समय 256 परिदृश्य में एक हेपडम्प लेता हूं तो मुझे कई डुप्लिकेट कक्षाएं लोड होंगी (उदाहरण के गले में यह दिखा सकता है कि उस समय लोड प्रत्येक ग्रोवी वर्ग के ~ 20 संस्करण हैं)। इसके अलावा, 128 ग्राफ़ में, लाइन में प्रत्येक चरण एक रीलोड के लिए कम या कम से संबंधित है - ताकि आप देख सकें कि पूरे सेट को पुनः लोड करने से केवल 5 5 एमबी की तरह दिखने वाले परमजन बढ़ जाता है) – rhinds