में जा रहा है यह देखने के लिए कि कचरा कलेक्टर कैसे काम करते हैं, एक बहुत ही सरल कोड चलाएं।अप्रत्याशित जीसी व्यवहार: कुछ डेटा हमेशा कार्यकाल
String a = null;
while (true) {
a = new String(" no... ");
}
मैं समांतर जीसी का उपयोग कर रहा हूं। मैंने जीसी परिणामों को मुद्रित किया और यहां पहला (मामूली) जीसी है।
[GC [PSYoungGen: 16448K->1616K(19136K)] 16448K->1624K(62848K), 0.0022134 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
youngGen 14880K
की कमी आई है लेकिन fullHeap सिर्फ 14872K
की कमी आई है इसका मतलब यह है 8k कार्यकाल पीढ़ी के लिए ले जाया गया है? मेरी समझ यह है कि जीसी को कक्षा 'ए' के कुछ संस्थानों को जिंदा चिह्नित किया जाना चाहिए और कार्यकाल में स्थानांतरित होना चाहिए। क्या यह समझ सही है? इसके अलावा, यह "Floating Garbage" है? ओवरटाइम कार्यकाल पीढ़ी भर जाती है और एक पूर्ण जीसी की आवश्यकता होती है, हालांकि इसमें कुछ समय लगता है।
इसके अलावा, इस विशेष मामले में, पूरे मामूली संग्रह को एकत्रित नहीं किया गया है और आदर्श कार्यकाल में कुछ भी नहीं है? ये सभी अल्पकालिक वस्तुएं हैं।
धन्यवाद। यदि स्ट्रिंग ऑब्जेक्ट्स ओल्ड जेनरेशन में कभी नहीं जाते हैं, तो ढेर (धीरे-धीरे लेकिन स्थिरता) क्यों पूर्ण हो जाता है जिसके बाद एक पूर्ण जीसी की आवश्यकता होती है। आपको क्या लगता है कि वह पुरानी जीन भर रहा है? –
JVM में कम से कम 20 अन्य थ्रेड चल रहे हैं, न केवल आपके "मुख्य" थ्रेड, इसलिए यह काफी तार्किक है कि कुछ ऑब्जेक्ट्स बनाए जाते हैं। उदाहरण: टाइमर धागे या जीसी धागे स्वयं। महत्वपूर्ण बात यह है कि एक पूर्ण जीसी के बाद, आप बहुत सारी यादें पुनः प्राप्त करते हैं। –
@ एनएम। एक साइडपॉइंट के रूप में, ध्यान दें कि पियरे ने कहा था कि आपके उदाहरण में स्ट्रिंग्स ऑब्जेक्ट्स पुराने जीन में नहीं जाएंगे, न कि सामान्य रूप से स्ट्रिंग ऑब्जेक्ट्स पुराने में जाते हैं। – monkjack