में ओरेकल प्रलेखन मैंने पाया:
-Xmxsize बाइट्स में स्मृति आवंटन पूल का अधिकतम आकार (बाइट्स में) निर्दिष्ट करता है ... डिफ़ॉल्ट मान सिस्टम कॉन्फ़िगरेशन के आधार पर रनटाइम पर चुना जाता है।
सिस्टम कॉन्फ़िगरेशन का क्या अर्थ है?
में ओरेकल प्रलेखन मैंने पाया:
-Xmxsize बाइट्स में स्मृति आवंटन पूल का अधिकतम आकार (बाइट्स में) निर्दिष्ट करता है ... डिफ़ॉल्ट मान सिस्टम कॉन्फ़िगरेशन के आधार पर रनटाइम पर चुना जाता है।
सिस्टम कॉन्फ़िगरेशन का क्या अर्थ है?
-Xmx, कम से कम जावा 8 में, क्योंकि मेरे लिनक्स 64 बिट सिस्टम पर, 6Gb के रूप में कुल मेमोरी के साथ, मेरे पास एक jvm है -Xmx = 1.5Gb, डिफ़ॉल्ट रूप से।
जवाबों:
यह कार्यान्वयन और संस्करण पर भिन्न होता है, लेकिन आमतौर पर यह आपके द्वारा उपयोग किए गए VM (जैसे क्लाइंट या सर्वर, देखें -clientऔर -serverपैरामीटर) और आपके सिस्टम मेमोरी पर निर्भर करता है ।
अक्सर clientडिफ़ॉल्ट मान के लिए आपकी भौतिक मेमोरी का 1 / 4th या 1GB (जो भी छोटा हो) होता है।
इसके अलावा जावा विन्यास विकल्प (कमांड लाइन पैरामीटर) पर्यावरण चर के लिए "आउटसोर्स" हो -Xmxसकते हैं, जो डिफ़ॉल्ट को बदल सकते हैं (मतलब एक नया डिफ़ॉल्ट निर्दिष्ट करें)। विशेष रूप से JAVA_TOOL_OPTIONSपर्यावरण चर को सभी जावा उपकरणों द्वारा जांचा जाता है और यदि मौजूद है (अधिक विवरण यहां और) यहां दिया गया है )।
डिफ़ॉल्ट मान देखने के लिए आप निम्न आदेश चला सकते हैं:
java -XX:+PrintFlagsFinal -version
यह आपको एक loooong सूची देता है, -Xmxमें है MaxHeapSize, -Xmsमें है InitialHeapSize। अपने आउटपुट को फ़िल्टर करें (जैसे |grepकि लिनक्स पर) या इसे किसी फ़ाइल में सहेजें ताकि आप इसमें खोज कर सकें।
java -XX:+PrintCommandLineFlagsJVM द्वारा वर्तमान प्रणाली की जानकारी के आधार पर चुने गए ढेर के आकार (और अन्य जानकारी) को प्रिंट करने के लिए चला सकते हैं
-XX:+PrintFlagsFinal, आपने जो सुझाव दिया था वह मेरे लिए काम नहीं करता है। इसे उत्तर में जोड़ना।
-XX:+PrintFlagsFinalसबसे अच्छा विकल्प है क्योंकि इसमें सभी जानकारी को ध्यान में रखने के बाद सब कुछ दिखाना चाहिए (मैनुअल विकल्प और एर्गोनॉमिक्स सहित)। हालांकि -XX:+PrintCommandLineFlagsमेरे जेवीएम (सटीक संस्करण पर निर्भर हो सकता है) पर काम करने के लिए लगता है
java -XX:+PrintFlagsFinal -version | grep HeapSize
जैसा कि आपने उल्लेख किया है, डिफ़ॉल्ट -Xmxsize(अधिकतम HeapSize) आपके सिस्टम कॉन्फ़िगरेशन पर निर्भर करता है।
जावा 8 client आपकी भौतिक मेमोरी का बड़ा हिस्सा आपके Xmssize(न्यूनतम हेपसाइज़) और आपके भौतिक मेमोरी के 1 / 4th से -Xmxsizeअधिक ले जाता है।
जिसका मतलब है कि अगर आपके पास 8GB रैम की फिजिकल मेमोरी है, तो आपके पास होगा Xmssize 8 * (1/6) और -Xmxsize8 * (1/4) के छोटे के रूप में होगा।
आप अपने डिफ़ॉल्ट HeapSize की जाँच कर सकते हैं
में विंडोज :
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
में लिनक्स :
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
इन डिफ़ॉल्ट मानों को आपकी इच्छित राशि पर भी अधिलेखित किया जा सकता है।
हैरानी की बात यह है कि इस सवाल का कोई निश्चित दस्तावेज नहीं है। शायद एक अन्य डेटा बिंदु एक जवाब की तलाश में दूसरों को मूल्य प्रदान करेगा। CentOS (6.8,7.3) और Java 8 चलाने वाले मेरे सिस्टम पर (1.8.0_60-b27, 64-बिट सर्वर का निर्माण करें):
डिफ़ॉल्ट मेमोरी 1/4 भौतिक मेमोरी है, जो 1GB द्वारा सीमित नहीं है।
इसके अलावा, -XX:+PrintFlagsFinalSTDERR को प्रिंट करता है ताकि ऊपर दूसरों द्वारा प्रस्तुत की गई वर्तमान डिफ़ॉल्ट मेमोरी निर्धारित करने के लिए निम्नलिखित को ट्वीक किया जाए:
java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize
निम्न 64 GB भौतिक RAM के साथ सिस्टम पर दिया गया है:
uintx MaxHeapSize := 16873684992 {product}
मेरे Ubuntu वीएम पर, 1048 एमबी कुल रैम के साथ, java -XX:+PrintFlagsFinal -version | grep HeapSizeमुद्रित: uintx MaxHeapSize := 266338304जो लगभग 266 एमबी है और मेरे कुल रैम का 1 / 4th है।
के रूप में 8 मई, 2019:
JVM ढेर का आकार सिस्टम कॉन्फ़िगरेशन पर निर्भर करता है, जिसका अर्थ है:
a) क्लाइंट jvm बनाम सर्वर jvm
बी) 32 बिट बनाम 64 बिट ।
लिंक:
1) J2SE5.0 से अपडेशन: https://docs.oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html
2) संक्षिप्त उत्तर: https://docs.oracle.com/ javase / 8 / डॉक्स / तकनीकी / गाइड / vm / gctuning / ergonomics.html
3) विस्तृत जवाब: https://docs.oracle.com/javase/8/docs/technotes/guides/vm-gctuning/parallel.html# default_heap_size
4) क्लाइंट बनाम सर्वर: https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html
सारांश: (उपरोक्त लिंक से समझना कठिन है। इसलिए उन्हें यहाँ संक्षेप में प्रस्तुत कर रहा हूं)
1) क्लाइंट jvm के लिए डिफ़ॉल्ट अधिकतम ढेर का आकार 256mb है (एक अपवाद है, ऊपर दिए गए लिंक से पढ़ें)।
2) 32 बिट के सर्वर जेवीएम के लिए डिफ़ॉल्ट अधिकतम ढेर का आकार 1 जीबी है और 64 बिट 32 जीबी है (फिर से यहां अपवाद भी हैं। कृपया इसे लिंक से पढ़ें)।
तो डिफ़ॉल्ट अधिकतम jvm हीप आकार है: 256mb या 1gb या 32gb वीएम पर निर्भर करता है, ऊपर।