जावा कचरा संग्रह लॉग संदेश


96

मैंने लॉग में कचरा संग्रह जानकारी को डंप करने के लिए जावा को कॉन्फ़िगर किया है ( क्रिया जीसी )। मैं इस बात से अनिश्चित हूं कि लॉग में कचरा संग्रह प्रविष्टियों का क्या मतलब है। इन प्रविष्टियों का एक नमूना नीचे पोस्ट किया गया है। मैंने Google पर चारों ओर खोज की है और ठोस स्पष्टीकरण नहीं पाया है।

मेरे पास कुछ उचित अनुमान हैं, लेकिन मैं उन उत्तरों की तलाश कर रहा हूं जो प्रविष्टियों में मौजूद संख्याओं के बारे में सख्त परिभाषा प्रदान करते हैं, जो विश्वसनीय स्रोतों द्वारा समर्थित हैं। सभी उत्तरों के लिए एक स्वचालित +1 जो सूर्य प्रलेखन का हवाला देता है। मेरे प्रश्न हैं:

  1. PSYoungGen का क्या उल्लेख है? मुझे लगता है कि यह पिछली (युवा?) पीढ़ी के साथ कुछ करना है, लेकिन वास्तव में क्या?
  2. संख्याओं के दूसरे तीन और पहले के बीच क्या अंतर है?
  3. एक नाम (PSYoungGen) संख्याओं के पहले ट्रिपल के लिए क्यों निर्दिष्ट किया गया है लेकिन दूसरा नहीं?
  4. त्रिकाल में प्रत्येक संख्या (स्मृति आकार) क्या है। उदाहरण के लिए 109884K-> 14201K (139904K), GC 109884k से पहले मेमोरी है और फिर इसे 14201K तक घटा दिया गया है। तीसरा नंबर कैसे प्रासंगिक है? हमें संख्याओं के दूसरे सेट की आवश्यकता क्यों होगी?

8109.128: [GC [PSYoungGen: 109884K-> 14201K (139904K)] 691015K-> 595332K (1119040K), 0.0454530 सेकंड]

8112.111: [GC [PSYoungGen: 126649K-> 15528K (142336K)] 707780K-> 605892K (1121472K), 0.0934560 सेकंड]

8112.802: [GC [PSYoungGen: 130344K-> 3732K (118592K)] 720708K-> 607895K (1097728K), 0.0682690 सेकंड]


पूरे ढेर, हीप के युवा पीढ़ी के हिस्से, जीसी कैसे काम करता है के लिए मामूली जीसी, उदाहरण के लिए cubrid.org/blog/dev-platform/…
MarianP

जवाबों:


90

इसमें से अधिकांश को जीसी ट्यूनिंग गाइड में समझाया गया है (जो आप वैसे भी पढ़ने के लिए अच्छा करेंगे)।

कमांड लाइन विकल्प -verbose:gcढेर और कचरा संग्रह के बारे में जानकारी को प्रत्येक संग्रह में मुद्रित करने का कारण बनता है। उदाहरण के लिए, यहां एक बड़े सर्वर एप्लिकेशन से आउटपुट है:

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

यहाँ हम दो छोटे संग्रह देखते हैं जिसके बाद एक बड़ा संग्रह है। तीर से पहले और बाद की संख्या (जैसे, 325407K->83000Kपहली पंक्ति से) क्रमशः कचरा संग्रह से पहले और बाद में जीवित वस्तुओं के संयुक्त आकार को दर्शाती है। मामूली संग्रह के बाद आकार में कुछ ऑब्जेक्ट शामिल होते हैं जो कचरा (अब जीवित नहीं हैं) लेकिन फिर से प्राप्त नहीं किया जा सकता है। ये ऑब्जेक्ट या तो टेन्योर जेनरेशन में निहित हैं, या टेन्योर या स्थायी पीढ़ियों से संदर्भित हैं।

कोष्ठक में अगली संख्या (जैसे, (776768K)पहली पंक्ति से फिर से) ढेर का प्रतिबद्ध आकार है: ऑपरेटिंग सिस्टम से अधिक मेमोरी का अनुरोध किए बिना जावा ऑब्जेक्ट के लिए उपयोग करने योग्य स्थान की मात्रा। ध्यान दें कि इस संख्या में उत्तरजीवी रिक्त स्थान शामिल नहीं है, क्योंकि किसी भी समय केवल एक का उपयोग किया जा सकता है, और इसमें स्थायी पीढ़ी भी शामिल नहीं है, जो वर्चुअल मशीन द्वारा उपयोग किए जाने वाले मेटाडेटा को रखती है।

लाइन पर अंतिम आइटम (जैसे, 0.2300771 secs) संग्रह करने के लिए लिए गए समय को इंगित करता है; इस मामले में एक सेकंड के लगभग एक चौथाई।

तीसरी पंक्ति में प्रमुख संग्रह के लिए प्रारूप समान है।

द्वारा उत्पादित आउटपुट का प्रारूप -verbose:gcभविष्य के रिलीज में परिवर्तन के अधीन है।

मुझे यकीन नहीं है कि आपके यहां PSYoungGen क्यों है; क्या आपने कचरा संग्रहकर्ता को बदल दिया है?


जहाँ जीसी लॉग फ़ाइलों को खोजने के लिए?
श्री लोउ

7
यह उत्तर वास्तव में मूल प्रश्नों को संबोधित नहीं करता है। मुझे लगता है कि माइकलजोसेफ का जवाब बेहतर है। यह ईथन द्वारा पूछे गए प्रश्नों को संबोधित करता है और मूल उदाहरण को तोड़ते हुए बेहतर काम करता है। जबकि उनके उत्तर में दो मुद्दे हैं (उनका लिंक अब मृत हो गया है और राफा। रेफरी ने दूसरे को इंगित किया है), यह सिर्फ एक ओरेकल डॉक्टर को फिर से दर्ज नहीं करता है।
डिर्क

127
  1. PSYoungGen मामूली संग्रह के लिए उपयोग में कचरा संग्रहकर्ता को संदर्भित करता है। PS समानांतर स्कैवेंज के लिए खड़ा है।
  2. संख्या का पहला सेट युवा पीढ़ी के आकार के पहले / बाद में और दूसरा सेट पूरे ढेर के लिए है। ( कचरा संग्रहण समस्या का निदान प्रारूप का विवरण)
  3. नाम सवाल में पीढ़ी और कलेक्टर को इंगित करता है, दूसरा सेट पूरे ढेर के लिए है।

संबंधित पूर्ण जीसी का एक उदाहरण पुराने और स्थायी पीढ़ियों के लिए उपयोग किए गए कलेक्टरों को भी दिखाता है:

3.757: [Full GC [PSYoungGen: 2672K->0K(35584K)] 
            [ParOldGen: 3225K->5735K(43712K)] 5898K->5735K(79296K) 
            [PSPermGen: 13533K->13516K(27584K)], 0.0860402 secs]

अंत में, अपने उदाहरण लॉग आउटपुट की एक पंक्ति को तोड़कर:

8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs]
  • 107Mb जीसी से पहले इस्तेमाल किया, 14MB जीसी, अधिकतम युवा पीढ़ी आकार के बाद इस्तेमाल किया 137Mb
  • 675Mb ढेर से पहले जी सी, इस्तेमाल किया 581Mb जीसी, बाद इस्तेमाल ढेर 1Gb अधिकतम ढेर आकार
  • मामूली जीसी जेवीएम की शुरुआत से 8109.128 सेकंड हुई और 0.04 सेकंड लगे

8
बस एक मामूली टिप्पणी, '()' के बीच का मान अधिकतम आकार नहीं है, हमेशा के लिए, अधिकतम आकार है। यदि जीसी कम को मुक्त नहीं कर सकता है, तो परिचालन सिस्टेम के लिए इस सीमा को अधिक स्थान की आवश्यकता होगी, और यह मान बढ़ जाएगा। पाठ्यक्रम की
इज्जत करना

@ rafa.ferreira मुझे लगता है कि पैरेन्थेसिस में मूल्य अर्थात 1119040K प्रतिबद्ध ढेर आकार है। मुझे नहीं लगता, GC कहीं भी 'अधिकतम ढेर' आकार का प्रिंट देता है। संदर्भ 1 और संदर्भ 2
रोहितमोहता

23

मैं सिर्फ इस बात का उल्लेख करना चाहता था कि कोई व्यक्ति विस्तृत जीसी लॉग इन कर सकता है

-XX:+PrintGCDetails 

पैरामीटर। फिर आप उत्तर में PSYoungGen या PSPermGen आउटपुट देखें।

इसके -Xloggc:gc.logसमान आउटपुट उत्पन्न करने के लिए लगता है, -verbose:gcलेकिन आप पहले में एक आउटपुट फ़ाइल निर्दिष्ट कर सकते हैं।

उदाहरण का उपयोग:

java -Xloggc:./memory.log -XX:+PrintGCDetails Memory

बेहतर डेटा की कल्पना करने के लिए आप gcviewer (हाल ही में संस्करण github पर पाया जा सकता है ) की कोशिश कर सकते हैं ।

मापदंडों को सही ढंग से लिखने के लिए ध्यान रखें, मैं "+" भूल गया और मेरा JBoss बिना किसी त्रुटि संदेश के शुरू नहीं होगा!


3
ध्यान दें कि java फिर से शुरू होने पर glog को अधिलेखित कर दिया जाएगा (जैसे, यदि आप अपने tomcat को पुनः आरंभ करते हैं क्योंकि यह मेमोरी समस्याएँ थीं, और आप उस glog को देखना पसंद करेंगे)। या कम से कम यह होगा यदि आप जीसी लॉग को घुमाते हैं। जीसी लॉगिंग को नियंत्रित करने वाले कई अन्य विकल्प हैं। Oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html देखें । विशेष रूप से, विचार करें-XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<some number of files> -XX:GCLogFileSize=<some size> -XX:+PrintTenuringDistribution
Dan Pritts
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.