2012-02-21 13 views
10

सवाल मूल रूप से शीर्षक में निहित है।क्या जेवीएम बल कचरा संग्रह करता है जब यह इसकी -Xmx सीमा तक पहुंचता है?

कहें कि आपके पास एक ऐसा एप्लिकेशन है जो इसकी JVM -Xmx सीमा तक पहुंच गया है। जब उस एप्लिकेशन को अधिक मेमोरी की आवश्यकता होती है तो कचरा संग्रह मजबूर होता है? (हॉटस्पॉट जेवीएम में)

एक दूसरी अजीब चीज़ जो मैं समझा नहीं सकता वह यह है कि मेरे पास वर्तमान में एक एप्लिकेशन सर्वर है जो एक्सएक्सएक्स = 2048 मीटर के साथ चलाया गया है, "शीर्ष" कमांड (लिनक्स पर) इसकी रिपोर्ट 2.7 जी है प्रक्रिया।

तो किसी एप्लिकेशन को अपने -Xmx से अधिक होने की अनुमति कब/कब दी जाती है?

धन्यवाद,

+1

'-Xmx = 2048' 2048 बाइट्स है:

यहाँ एक अच्छा लेख स्मृति आवंटन का वर्णन है। मुझे लगता है कि आपका मतलब है '-Xmx = 2048m' नोट: आप केवल' -mx2g' लिख सकते हैं जो एक ही बात है। –

+0

@ पीटर Lawrey धन्यवाद, हाँ मेरा मतलब 2048 मीटर था। सवाल संपादित किया। – Simeon

उत्तर

11

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

+2

+1: आमतौर पर एक पूर्ण कार्यरत स्थान एक पूर्ण जीसी ट्रिगर करता है। मामूली संग्रह आम तौर पर ऐसा होने से पहले वस्तुओं को स्थानांतरित स्थान पर स्थानांतरित करके जीवित रहने वाले स्थान से बचते हैं। –

+2

'-Xmx' केवल अधिकतम ढेर आकार सेट करता है। यह अक्सर सबसे बड़ा क्षेत्र है, लेकिन एकमात्र क्षेत्र नहीं है। आपके पास थ्रेड स्टैक, सीधी मेमोरी, साझा लाइब्रेरीज़, जेवीएम इत्यादि हैं। –

1

हाँ, अगर आप अभी भी स्मृति नहीं पाते हैं यह OutOfMemory त्रुटि को बढ़ा देंगे। मैं इसे इस तरह समझता हूं।

3

आमतौर पर यह मामला है, गठबंधन कलेक्टर के आधार पर गठबंधन जीसी आमतौर पर बहुत जल्द ट्रिगर होता है।

1

आईआईआरसी गारंटी है कि एक पूर्ण जीसी OutOfMemoryError से पहले किया जाएगा। चूंकि ढेर आकार सीमा से अधिक होने के परिणामस्वरूप ऐसी त्रुटि होनी चाहिए, जिसका अर्थ है कि सीमा तक पहुंचने पर आपके पास हमेशा कम से कम एक पूर्ण जीसी रन होगा।

3

हां, जेवीएम निश्चित रूप से जीसी को कॉल करेगा यदि यह ढेर सीमा तक पहुंच जाए (और शायद बहुत जल्द)। अगर इससे मदद नहीं मिलती है, तो यह OutOfMemoryError एस फेंक देगा।

कारण आप एक बड़ी प्रक्रिया मेमोरी खपत क्यों देख रहे हैं यह है कि -Xmx विकल्प केवल जावा हीप स्पेस को सीमित करता है (जहां जावा ऑब्जेक्ट्स आवंटित किए जाते हैं)। जेवीएम द्वारा अतिरिक्त रूप से उपयोग किए जाने वाले कई अन्य मेमोरी क्षेत्र भी हैं: थ्रेड स्टैक्स के लिए स्थान, "पर्मजेन" (जहां कक्षाएं और उनका कोड संग्रहीत किया जाता है), ByteBuffers के माध्यम से आवंटित "प्रत्यक्ष" स्मृति, मूल पुस्तकालयों द्वारा आवंटित स्मृति इत्यादि। कुछ के लिए इन अतिरिक्त मेमोरी क्षेत्रों में अन्य कॉन्फ़िगरेशन विकल्प मौजूद हैं जो उन्हें सीमित करने की अनुमति देते हैं, उदाहरण के लिए -Xss, लेकिन कुछ JVM के नियंत्रण से बाहर भी हैं।

0

कचरा संग्रहण काफी एक बड़े क्षेत्र है, लेकिन क्या आप कहते हैं कि पूरा संग्रह के लिए सही है (वहाँ अन्य प्रकार के होते हैं)

एक बात है कि -Xmx अधिकतम ढेर आकार सेट करता है के बारे में पता होना करने के लिए, लेकिन वहाँ भी है एक -Xms, जो न्यूनतम हथियार आकार है। आपका एप्लिकेशन केवल न्यूनतम कॉन्फ़िगरेशन के साथ शुरू हो सकता है। फिर यदि स्मृति का उपयोग उस तक पहुंच जाता है, तो यह एक पूर्ण कचरा संग्रह ट्रिगर करेगा और न्यूनतम (-एक्सएमएक्स) से अधिकतम ढेर की मात्रा बढ़ाएगा, अधिकतम मूल्य (-Xmx) से कम या उसके बराबर कुछ मूल्य तक। यह कई बार हो सकता है, अधिकतम तक पहुंचने तक। इसके बाद, यह अब ढेर में वृद्धि नहीं कर सकता है लेकिन कचरा संग्रह तब तक जारी रहेगा जब अधिकतम अधिकतम पहुंच जाए।

7

एक्सएमएक्स पैरामीटर केवल ढेर के आकार को निर्दिष्ट करता है। जावा प्रक्रिया में अधिक मेमोरी होती है क्योंकि ढेर जावा प्रक्रिया का केवल एक हिस्सा है, मुझे लगता है कि आपके पास अन्य सामान भी हैं जो जावा प्रक्रिया में देशी पुस्तकालयों, परम जीन और एप्लिकेशन द्वारा बनाई गई देशी स्मृति आवंटन भी शामिल हैं। http://www.ibm.com/developerworks/java/library/j-nativememory-linux/

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