2013-02-19 103 views
9

क्या वीएम जब स्मृति के उपयोग बढ़ जाती है पिछले 512 एम के व्यवहार होगा निम्नलिखितजावा ढेर व्यवहार

-Xmx2048m -Xms512m 

की तरह एक जावा स्मृति विन्यास को देखते हुए? क्या कोई विशेष एल्गोरिदम है जो इसका अनुसरण करता है? अर्थात। क्या यह सीधे अधिकतम तक जाता है, क्या यह दोहराता है, क्या यह वृद्धि में जाता है, या क्या यह केवल आवंटित करता है क्योंकि इसे स्मृति की आवश्यकता होती है? यह कितना महंगा है?

मैं विशेष रूप से ओरेकल/सन जेवीएम, संस्करण 1.6 में देख रहा हूं। मुझे लगता है कि यह ओरेकल वेबसाइट पर कहीं भी दस्तावेज है, लेकिन मुझे इसे खोजने में परेशानी हो रही है।

+0

यह निश्चित रूप से अधिकतम तक नहीं जाता है। –

+0

आप न्यूनतम + अधिकतम परिभाषित कर रहे हैं। यह कम से कम 512 एमबी होगा लेकिन 2048 एमबी की टोपी होगी। – adrian

+0

मेरी समझ से, JVM प्रारंभ होने पर न्यूनतम मेमोरी मान आवंटित किया जाता है - इसलिए, स्टार्टअप पर, यह मेजबान ऑपरेटिंग सिस्टम से 512 मीटर का उपयोग अपने स्वयं के उपयोग के लिए करता है। जो मुझे समझ में नहीं आता है, उसे 512 मीटर से अधिक की आवश्यकता होती है, यह कितना लेता है, और यह कैसे लेता है? उदाहरण के लिए - जेवीएम को 750 एमबी की आवश्यकता है - क्या यह 750 एमबी का उपभोग करेगा, या 1024 एमबी तक बढ़ेगा? या किसी अन्य व्यवहार का पालन करें? – Ren

उत्तर

6

यह कचरा कलेक्टर का काम है कि यह तय करने के लिए कि आकार बदलने के लिए जरूरी है, इसलिए यह जीसी पैरामीटर 'मिनफ्री हेपराटियो' द्वारा निर्धारित किया जाता है। यदि जीसी को और अधिक जगह चाहिए, तो यह उस आकार तक बढ़ेगा जहां उस मूल्य द्वारा निर्दिष्ट ढेर का% उपलब्ध है।

आधुनिक प्लेटफार्म पर एक सामान्य मूल्य 40ish है, इसलिए यदि आप 512 एमबी से शुरू करते हैं और 40% से कम मुक्त है, जिसका अर्थ है कि आप ~ 308 एमबी से अधिक हो गए हैं, तो यह 40% तक फिर से मुक्त हो जाएगा। तो संग्रह के बाद कहें कि अभी भी 400 एमबी लाइट ऑब्जेक्ट्स हैं, तो आपका ढेर ~ 667 एमबी तक बढ़ जाएगा। (हां इसका नाम अनुपात है लेकिन तर्क के रूप में% मान की अपेक्षा करता है ... मुझे खोजें!)

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

यह जावा 6 में डिफ़ॉल्ट पर लागू होता है। यदि आप कस्टम कचरा कलेक्टर कॉन्फ़िगरेशन का उपयोग करते हैं तो यह अलग हो सकता है। आप इसके बारे में यहां पढ़ सकते हैं: http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#generation_sizing.total_heap

(ऑपरेशन प्रकार का "व्यय" ऑपरेटिंग सिस्टम पर निर्भर करता है और और क्या चल रहा है। अगर सिस्टम लोड हो गया है और ओएस को कुछ स्वैपिंग करना है आपके लिए स्मृति का एक संगत ब्लॉक, तो यह बहुत महंगा हो सकता है!)

+0

बस मुझे क्या चाहिए! धन्यवाद। – Ren

2

-verbose:gc और/या -XX:+PrintGCDetails विकल्पों का उपयोग आपको कई बेहतर विवरण देना चाहिए।

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

उपरोक्त आधिकारिक document से लिया की एक व्याख्या:

यहाँ हम देखते हैं दो नाबालिग संग्रह एक प्रमुख द्वारा पीछा

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

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

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

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

न्यूनतम और अधिकतम ढेर आकार अपडेट करने के साथ इस तरह से एक एप्लिकेशन चलाना वीएम के ढेर आवंटन और कचरा संग्रहण पैटर्न में अच्छी अंतर्दृष्टि दे सकता है।

0

यह ध्यान दिया जाना चाहिए कि प्रारंभिक पर जेवीएम वर्चुअल रूप से अधिकतम पता स्थान सुरक्षित रखता है लेकिन भौतिक स्मृति आवंटित नहीं करता है। आम तौर पर जेवीएम पुरानी और युवा पीढ़ी में जगह आवंटित करेगा। यंग जेनरेशन में इंटरमीडिएटरी स्पेस है। बुलाए गए नए ऑब्जेक्ट्स यंग जेनरेशन में निहित हैं।

जब इंटरमीडिएटरी स्पेस भर जाता है, जीसी का आह्वान किया जाता है जो यंग जेनरेशन सेगमेंट में सर्वविर स्पेस नामक इंटरमीडिएटरी स्पेस में से किसी एक को ऑब्जेक्ट्स संदर्भित करता है। जीसी थ्रेड के स्टेट एल्गोरिदम या एल्गोरिदम को सहेजकर "स्टॉप-द-वर्ल्ड" का पालन कर सकता है ताकि प्रक्रियाएं चलती रहें (?)।

जब उत्तरजीवी अंतरिक्ष भर जाता है तो JVM एक पूर्ण जीसी का आह्वान करता है।