2012-10-29 6 views
13

मैंने जी 1 कचरा कलेक्टर का उपयोग करके अपने आवेदन में कभी-कभी पूर्ण जीसी देखा है, और यह पता लगाने की कोशिश कर रहा हूं कि वे क्यों होते हैं।जावा 7 में जी 1 कचरा कलेक्टर का कारण इसके समवर्ती-निशान चरण को रद्द करने का क्या कारण बनता है?

एक क्षेत्र-स्कैन-शुरू से चक्र अगले चक्र को नीचे उद्धृत किया गया है। 61807.406 पर, एक पूर्ण जीसी लॉग है, इसके बाद समवर्ती-मार्क-अपोर्ट के लिए एक प्रविष्टि है। मैं क्या जानना चाहता हूं कि जीसी को एक पूर्ण, स्टॉप-द-वर्ल्ड, कचरा संग्रह करने की आवश्यकता क्यों महसूस हुई और मैं इससे कैसे बच सकता हूं।

ध्यान दें कि this question ओपनजेडीके मेलिंग सूची पर पहले से कोई प्रतिक्रिया नहीं मिली है।

मैंने युवा जीसी के विवरण को संक्षिप्तता के लिए छंटनी की है, लेकिन यदि आवश्यक हो तो मैं कहीं भी पूर्ण खंड पोस्ट कर सकता हूं।

61805.878: [GC concurrent-root-region-scan-start] 
61805.882: [GC concurrent-root-region-scan-end, 0.0033586] 
61805.882: [GC concurrent-mark-start] 
61806.133: [GC pause (young), 0.02836202 secs] 
    [Eden: 498M(498M)->0B(478M) Survivors: 14M->34M Heap: 3025M(4096M)->2548M(4096M)] 
[Times: user=0.19 sys=0.00, real=0.03 secs] 
61806.426: [GC pause (young), 0.02766222 secs] 
    [Eden: 478M(478M)->0B(480M) Survivors: 34M->32M Heap: 3050M(4096M)->2576M(4096M)] 
[Times: user=0.19 sys=0.00, real=0.03 secs] 
61806.717: [GC pause (young), 0.02214895 secs] 
    [Eden: 480M(480M)->0B(502M) Survivors: 32M->10M Heap: 3056M(4096M)->2571M(4096M)] 
[Times: user=0.09 sys=0.00, real=0.02 secs] 
61807.000: [GC pause (young), 0.01899188 secs] 
    [Eden: 502M(502M)->0B(502M) Survivors: 10M->10M Heap: 3074M(4096M)->2573M(4096M)] 
[Times: user=0.09 sys=0.00, real=0.02 secs] 
61807.201: [GC pause (young), 0.02619259 secs] 
    [Eden: 162M(502M)->0B(500M) Survivors: 10M->12M Heap: 3036M(4096M)->2876M(4096M)] 
[Times: user=0.11 sys=0.00, real=0.03 secs] 
61807.283: [GC pause (young), 0.02068515 secs] 
    [Eden: 102M(500M)->0B(500M) Survivors: 12M->12M Heap: 3058M(4096M)->2957M(4096M)] 
[Times: user=0.09 sys=0.00, real=0.02 secs] 
61807.350: [GC pause (young), 0.01606520 secs] 
    [Eden: 52M(500M)->0B(498M) Survivors: 12M->14M Heap: 3020M(4096M)->2969M(4096M)] 
[Times: user=0.11 sys=0.00, real=0.02 secs] 
61807.389: [GC pause (young), 0.01573865 secs] 
    [Eden: 42M(498M)->0B(500M) Survivors: 14M->12M Heap: 3021M(4096M)->2978M(4096M)] 
[Times: user=0.09 sys=0.00, real=0.02 secs] 
61807.406: [Full GC 2978M->2498M(4096M), 4.8896638 secs] 
[Times: user=6.37 sys=0.08, real=4.89 secs] 
61812.296: [GC concurrent-mark-abort] 
61812.542: [GC pause (young), 0.01526403 secs] 
    [Eden: 512M(500M)->0B(510M) Survivors: 0B->2048K Heap: 3018M(4096M)->2506M(4096M)] 
[Times: user=0.09 sys=0.00, real=0.02 secs] 
61812.793: [GC pause (young) (initial-mark), 0.01391544 secs] 
    [Eden: 510M(510M)->0B(508M) Survivors: 2048K->4096K Heap: 3016M(4096M)->2508M(4096M)] 
[Times: user=0.09 sys=0.00, real=0.01 secs] 
61812.807: [GC concurrent-root-region-scan-start] 

यह जावा हॉटस्पॉट 1.7.0_7 रिहाई उपयोग कर रहा है, तो निम्न दिलचस्प सेटिंग्स के साथ:

-XX:PermSize=128m 
-XX:MaxPermSize=128m 
-XX:NewSize=512m 
-XX:MaxNewSize=512m 
-Xms4096m 
-Xmx4096m 
-XX:+UnlockDiagnosticVMOptions 
-XX:+UnsyncloadClass 
-XX:+UseTLAB 
-XX:+UseG1GC 
-XX:SurvivorRatio=10 
-Xloggc:./workspace/gc.log 
-verbose:gc 
-XX:+PrintGC 
-XX:+PrintGCTimeStamps 
-XX:+PrintGCDetails 

उत्तर

7

मुझे लगता है आप this reference के बारे में पता। This page भी उपयोगी है।

पूर्ण जीसी तब होता है जब कार्यकाल वस्तुएं - जो अल्पकालिक (युवा) पीढ़ी में संग्रह से बचती हैं - उनके लिए आवंटित स्थान भरें। जब एक पूर्ण जीसी होता है, प्रगति पर था कि किसी भी अल्पकालिक अंकन निरस्त किया जाना चाहिए।

जिस अवधि पर कार्यरत पीढ़ी भरती है उस दर को कम करने के लिए या तो अधिक ढेर/रैम या कार्यकाल और युवा रिक्त स्थान के बीच उपलब्ध स्मृति के विभाजन के साथ झुकाव की आवश्यकता होती है। पैरामीटर NewSize, MaxNewSize और NewRatio उत्तरार्द्ध के लिए हैं। क्या काम करेगा यह जानने का एकमात्र तरीका प्रयोग है।

सामान्य ज्ञान यह है कि कार्यकाल को बढ़ाने के लिए अनुपात को स्थानांतरित करने से बड़े संग्रहों की संख्या कम हो जाती है। कई मामलों में यह सच है, लेकिन हमेशा नहीं। ऐसी स्थिति है जहां कार्यकाल के कुछ ही समय बाद कई कार्यरत वस्तुएं मर रही हैं। दूसरे शब्दों में, उन्हें युवा क्षेत्र में एकत्र किया जाना चाहिए था, लेकिन उनके जीवन के लिए बहुत देर हो चुकी थी। इस मामले में युवा पीढ़ी को बड़ा बनाने के लिए इन वस्तुओं को एकत्रित करने की बजाय वहां एकत्रित करने की अनुमति मिलती है। इसका एक लक्षण पूर्ण संग्रह है जो आवंटित स्थान में बड़ी कमी का कारण बनता है।

यह आपके मामले में प्रतीत नहीं होता है: 2978M->2498M। आपका एकमात्र आउट ढेर को बड़ा बनाना, आवश्यकतानुसार अधिक मेमोरी खरीदना हो सकता है। फिर भी, लगभग सभी सिस्टम जो लंबे समय तक चलते हैं, एक समय में एक बार पूरा संग्रह होगा।

+0

क्यू के युगल: 'पूर्ण जीसी तब होता है जब कार्यरत वस्तुओं ... उनके लिए आवंटित स्थान भरें'। मेरा कार्यकाल 3.5 जी (4 जी ढेर - 512 मीटर मैक्सन्यूसाइज) होना चाहिए। युवा संग्रह से पहले पूर्ण जीसी से पहले, ऐसा लगता है कि कार्यकाल में डेटा की मात्रा 3 जी थी। 3.5> 3, तो मुझे लगता है कि पूर्ण नहीं है और कोई जीसी नहीं है। क्या मैं उसको गलत व्याख्या कर रहा हूं? – sharakan

+0

'फिर भी, लगभग सभी सिस्टम जो लंबे समय तक चलते हैं, एक समय में एक बार पूरा संग्रह होगा।' मुझे पता है कि जावा 6 में सीएमएस के साथ यह सच है, हालांकि मेरे दिमाग में मुख्य रूप से विखंडन की वजह से। मैंने जी 1 के साथ सोचा था कि यह केवल तभी होगा जब अंकन धागे बस कचरा उत्पादन के साथ नहीं रह सके, जो उचित ट्यूनिंग से बचने योग्य होना चाहिए। किसी भी कारण से आपको लगता है कि जी 1 के साथ आपको कभी-कभी पूर्ण जीसी चलाने की ज़रूरत होगी? – sharakan

+0

जी 1 कई क्षेत्रों का उपयोग करता है। पूर्ण संग्रह तब होता है जब पदोन्नति विफल होती है: कॉम्पैक्शन के लिए कोई खाली क्षेत्र उपलब्ध नहीं है। जितना अधिक सिस्टम चलता है उतना ही बेहतर होगा कि हर क्षेत्र में कम से कम एक जीवित वस्तु होगी। – Gene

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