2013-07-15 3 views
8

में जा रहा है यह देखने के लिए कि कचरा कलेक्टर कैसे काम करते हैं, एक बहुत ही सरल कोड चलाएं।अप्रत्याशित जीसी व्यवहार: कुछ डेटा हमेशा कार्यकाल

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" है? ओवरटाइम कार्यकाल पीढ़ी भर जाती है और एक पूर्ण जीसी की आवश्यकता होती है, हालांकि इसमें कुछ समय लगता है।

इसके अलावा, इस विशेष मामले में, पूरे मामूली संग्रह को एकत्रित नहीं किया गया है और आदर्श कार्यकाल में कुछ भी नहीं है? ये सभी अल्पकालिक वस्तुएं हैं।

उत्तर

2

जीसी प्रगति पर है (जबकि लूप के अंदर मजबूत संदर्भ) जब आप 8k से बचते हैं तो आपको स्ट्रिंग जिंदा का 1 उदाहरण मिल गया है।

इस मामले में मैं स्ट्रिंग रेफ फ्लोटिंग कचरा नहीं कहूंगा। फ़्लोटिंग कचरा तब होता है जब जीसी ने जीसी होने के लिए तैयार नहीं किया था, लेकिन जीसी समाप्त होने तक तैयार था। इसका एक उदाहरण होगा।

Thread1: Person p = new Person("sammy") 

    Thread2: gc runs and sees that the Person instance is reachable through p. 

Thread1: p = null; // This Person instance is now unreachable. 

    Thread2: GC finishes. The person instance could have been collected but was reachable at the time the collector checked it. 
0

मुझे नहीं लगता कि आपका माप सटीक है।

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

इस बीच, जीसी के बाद कुल ढेर अधिभोग 1624K है, जिसका अर्थ है कि पुरानी पीढ़ी में वास्तव में 8K डेटा होता है।

शब्द "फ़्लोटिंग कचरा" शब्द सीएमएस संग्रह को संदर्भित करता है, जहां नव-मृत वस्तुओं को संग्राहक द्वारा पकड़ा नहीं जाता है। यह समानांतर जीसी के साथ लागू नहीं होता है।

आपके परीक्षण मामले के लिए, स्ट्रिंग ऑब्जेक्ट्स ओल्ड जेनरेशन में कभी नहीं जाएंगे। वे 1 जीसी चक्र में सबसे अधिक जीवित रहेंगे और एक उत्तरजीवी अंतरिक्ष में जाएंगे, और फिर

आशा है कि मदद करता है!

+0

धन्यवाद। यदि स्ट्रिंग ऑब्जेक्ट्स ओल्ड जेनरेशन में कभी नहीं जाते हैं, तो ढेर (धीरे-धीरे लेकिन स्थिरता) क्यों पूर्ण हो जाता है जिसके बाद एक पूर्ण जीसी की आवश्यकता होती है। आपको क्या लगता है कि वह पुरानी जीन भर रहा है? –

+0

JVM में कम से कम 20 अन्य थ्रेड चल रहे हैं, न केवल आपके "मुख्य" थ्रेड, इसलिए यह काफी तार्किक है कि कुछ ऑब्जेक्ट्स बनाए जाते हैं। उदाहरण: टाइमर धागे या जीसी धागे स्वयं। महत्वपूर्ण बात यह है कि एक पूर्ण जीसी के बाद, आप बहुत सारी यादें पुनः प्राप्त करते हैं। –

+0

@ एनएम। एक साइडपॉइंट के रूप में, ध्यान दें कि पियरे ने कहा था कि आपके उदाहरण में स्ट्रिंग्स ऑब्जेक्ट्स पुराने जीन में नहीं जाएंगे, न कि सामान्य रूप से स्ट्रिंग ऑब्जेक्ट्स पुराने में जाते हैं। – monkjack

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