2010-08-12 14 views
18

JVM -Xmx तर्क किसी को JVM के लिए अधिकतम मान आकार को कुछ मान पर सेट करने देता है। लेकिन, क्या उस मूल्य को गतिशील बनाने का कोई तरीका है? दूसरे शब्दों में, मैं जेवीएम को बताना चाहता हूं "देखो, अगर आपको इसकी ज़रूरत है, तो सिस्टम से बाहर होने तक सिस्टम से राम लेना जारी रखें।"क्या जेवीएम अधिकतम ढेर आकार गतिशील हो सकता है?

पूछने के लिए दो भाग का कारण: सबसे पहले, प्रश्न में ऐप उपयोगकर्ता की क्या कर रहा है, इस पर निर्भर करता है कि रैम की वास्तव में विस्तृत श्रृंखला का उपयोग कर सकते हैं, इसलिए वैचारिक न्यूनतम और अधिकतम मान बहुत दूर हैं। दूसरा, ऐसा लगता है कि JVM बूट समय पर वर्चुअल मेमोरी से अधिकतम ढेर स्थान सुरक्षित रखता है। यह विशेष ऐप हार्डवेयर की एक विस्तृत विस्तृत विविधता पर चलाया जाता है, इसलिए "एक-आकार-फिट-सब" अधिकतम हीप स्पेस चुनना कठिन होता है क्योंकि इसे कम-अंत हार्डवेयर पर चलाने के लिए पर्याप्त कम होना पड़ता है, लेकिन हम वास्तव में यदि वे उपलब्ध हैं तो वास्तव में बीफ़ी मशीनों का लाभ उठाने में सक्षम होना पसंद है।

+1

संभावित डुप्लिकेट: http://stackoverflow.com/questions/763295/setting-jvm-heap-size-at-runtime –

+1

और इससे संबंधित: http://stackoverflow.com/questions/2073869/how-to- वृद्धि-जावा-ढेर-आकार-प्रोग्रामेटिक रूप से –

+1

उन प्रश्नों का अंतर इरादे में है; मैं खुद के साथ कुछ भी नहीं करना चाहता, मैं वास्तव में चाहता हूं कि जेवीएम जादूगर रूप से मेरे लिए ऐसा करे। :) –

उत्तर

8

लेकिन, क्या यह मान गतिशील बनाने का कोई तरीका है?

सचमुच, नहीं। अधिकतम ढेर आकार JVM लॉन्च समय पर सेट किया गया है और इसे बढ़ाया नहीं जा सकता है।

प्रैक्टिस में, आप केवल अधिकतम ढेर आकार को अपने प्लेटफॉर्म की अनुमति के रूप में सेट कर सकते हैं, और जेवीएम को जितना आवश्यक हो उतना ढेर बढ़ने दें। ऐसा करने में एक स्पष्ट जोखिम है; यानी कि आपका आवेदन सभी मेमोरी का उपयोग करेगा और उपयोगकर्ता की मशीन को रोकने के लिए पीस देगा। लेकिन यह जोखिम आपके प्रश्न में निहित है।

संपादित

यह ध्यान देने योग्य है कि वहाँ विभिन्न -XX... जीसी ट्यूनिंग विकल्प है कि आप जिस तरह से है कि JVM ढेर (अधिकतम करने के लिए) का विस्तार tweak करने की अनुमति हैं कि लायक है।

एक और संभावना है कि आप अपने आवेदन को 2 भागों में विभाजित करें। आवेदन का पहला भाग समस्या के "आकार" को निर्धारित करने के लिए आवश्यक सभी तैयारी करता है। फिर यह एक उचित अधिकतम ढेर आकार का काम करता है, और एक नए जेवीएम में एप्लिकेशन के भूख दूसरे भाग की स्मृति शुरू करता है।

  • यह केवल तभी काम करता है जब एप्लिकेशन को उपरोक्त के रूप में समझदारी से विभाजित किया जा सके।

  • यह केवल तभी काम करता है जब समस्या आकार की गणना करना संभव हो। कुछ मामलों में, समस्या आकार की गणना करना परिणाम की गणना करने के लिए tantamount है।

  • यह स्पष्ट नहीं है कि आप केवल अधिकतम आकार तक बढ़ने की तुलना में बेहतर समग्र प्रदर्शन प्राप्त करेंगे।

+0

यही मैंने सोचा था, मैं बस यह सुनिश्चित करना चाहता था ... –

+1

मुझे कब्रिस्तान और सभी से नफरत है, लेकिन क्या आप एक मूल पुस्तकालय नहीं बना सकते हैं, जो पूरी तरह से हैकी तरीके से, ढेर के साथ ढेर आकार को समायोजित करता है और उचित चर सेट करता है ? –

5

ऐसा नहीं है। यह हो सकता है, और यह शायद:

-Xmx90% // 90% of physical memory 

हालांकि, एक डिफ़ॉल्ट निहित, 100%, एक अच्छा विचार नहीं है।

गैर-जीसी भाषा में लिखे गए एक कार्यक्रम में इसकी मेमोरी बहुत परिश्रमपूर्वक होती है, यह जल्द से जल्द किसी भी कचरे को छीन लेती है। यह समझ में आता है कि यह किसी भी स्मृति को प्राप्त करने की अनुमति देता है, यह मानते हुए कि यह त्वरित कचरा निपटान के लिए ज़िम्मेदार है।

एक जीसी भाषा अलग है। जब आवश्यक हो तो यह कचरा इकट्ठा करता है। जब तक कमरा है, तब तक यह कचरे के बारे में परवाह नहीं करता है। अगर यह सभी मेमोरी प्राप्त कर सकता है, तो यह कंप्यूटर में सभी मेमोरी प्राप्त करेगा।

तो एक जीसी प्रोग्रामर को कचरा के हर टुकड़े को निपटाने के बारे में चिंता करने की ज़रूरत नहीं है, लेकिन उसे अभी भी सहनशील कचरा/लाइव ऑब्जेक्ट अनुपात का सामान्य विचार होना चाहिए, और जीसी को एक्सएक्सएक्स के साथ निर्देश देना होगा।

+0

उत्कृष्ट सुझाव! –

+0

बस यह जोड़ने के लिए कि यह सीमा जीसीडी भाषाओं में निहित नहीं है, केवल संदिग्ध कार्यान्वयन के एक शोध ने जावा को – Basic

+1

चुना है माइक्रोसॉफ्ट जावा कार्यान्वयन (रास्ता वापस) में '-Xmx' अवधारणा नहीं थी और जितनी मेमोरी आवंटित की जा सकती थी आवश्यकता थी। –

3

असल में, आप शुद्ध जावा का उपयोग करके विभिन्न उपयोगकर्ताओं के हार्डवेयर के अनुकूल नहीं हो सकते हैं: वह तब होता है जब खोल/बैच स्क्रिप्टिंग का थोड़ा सा काम आसान हो सकता है।

मैं सिर्फ है कि ओएस एक्स और लिनक्स पर: मैं एक छोटे से बैश खोल स्क्रिप्ट है कि हार्डवेयर आवेदन पर चलाया जाता है पर निर्भर करता है सही JVM पैरामीटर खोजने और फिर JVM बुला का ख्याल रखता है मिल गया है।

ध्यान दें कि यदि आप एक डेस्कटॉप जावा अनुप्रयोग प्रदान कर रहे हैं, तो आप अपने उपयोगकर्ताओं को एक इंस्टॉलर प्रदान करने के लिए izpack की तरह कुछ का उपयोग करना चाहते हो सकता है:

http://izpack.org

मैं अगर पता नहीं है जावा यदि आप पेशेवर दिखने वाले डेस्कटॉप ऐप प्रदान करने की योजना बना रहे हैं तो उपयोगकर्ता की कॉन्फ़िगरेशन (शायद नहीं, और जेडब्ल्यूएस वास्तव में * * बड़े समय के आधार पर विभिन्न जेवीएम पैरामीटर प्रदान करने के लिए वेब स्टार्ट का उपयोग किया जा सकता है)।

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