जावा 8 में डिफ़ॉल्ट Xmxsize (अधिकतम ढेर आकार)


81

में ओरेकल प्रलेखन मैंने पाया:

-Xmxsize बाइट्स में स्मृति आवंटन पूल का अधिकतम आकार (बाइट्स में) निर्दिष्ट करता है ... डिफ़ॉल्ट मान सिस्टम कॉन्फ़िगरेशन के आधार पर रनटाइम पर चुना जाता है।

सिस्टम कॉन्फ़िगरेशन का क्या अर्थ है?


1
इसका मतलब है कि यदि आपके सिस्टम में 16 जीबी रैम है, तो आकार 512 एमबी है, तो इससे बड़ा होगा।
बजे जेबी निज़ेट

धन्यवाद, कितना बड़ा?
विटाली

"अधिकतम ढेर आकार" के लिए यहां देखें
Nir Alfasi

3
>> भौतिक मेमोरी या 1 जीबी के 1/4 वें के छोटे। धन्यवाद, @alfasin
विटाली

4
@Vitaly 1Gb सीमा लगती है -Xmx, कम से कम जावा 8 में, क्योंकि मेरे लिनक्स 64 बिट सिस्टम पर, 6Gb के रूप में कुल मेमोरी के साथ, मेरे पास एक jvm है -Xmx = 1.5Gb, डिफ़ॉल्ट रूप से।
user218867

जवाबों:


144

यह कार्यान्वयन और संस्करण पर भिन्न होता है, लेकिन आमतौर पर यह आपके द्वारा उपयोग किए गए VM (जैसे क्लाइंट या सर्वर, देखें -clientऔर -serverपैरामीटर) और आपके सिस्टम मेमोरी पर निर्भर करता है ।

अक्सर clientडिफ़ॉल्ट मान के लिए आपकी भौतिक मेमोरी का 1 / 4th या 1GB (जो भी छोटा हो) होता है।

इसके अलावा जावा विन्यास विकल्प (कमांड लाइन पैरामीटर) पर्यावरण चर के लिए "आउटसोर्स" हो -Xmxसकते हैं, जो डिफ़ॉल्ट को बदल सकते हैं (मतलब एक नया डिफ़ॉल्ट निर्दिष्ट करें)। विशेष रूप से JAVA_TOOL_OPTIONSपर्यावरण चर को सभी जावा उपकरणों द्वारा जांचा जाता है और यदि मौजूद है (अधिक विवरण यहां और) यहां दिया गया है )।

डिफ़ॉल्ट मान देखने के लिए आप निम्न आदेश चला सकते हैं:

java -XX:+PrintFlagsFinal -version

यह आपको एक loooong सूची देता है, -Xmxमें है MaxHeapSize, -Xmsमें है InitialHeapSize। अपने आउटपुट को फ़िल्टर करें (जैसे |grepकि लिनक्स पर) या इसे किसी फ़ाइल में सहेजें ताकि आप इसमें खोज कर सकें।


11
एक छोटे से जोड़ के रूप में, आप java -XX:+PrintCommandLineFlagsJVM द्वारा वर्तमान प्रणाली की जानकारी के आधार पर चुने गए ढेर के आकार (और अन्य जानकारी) को प्रिंट करने के लिए चला सकते हैं
क्रिस्टियान वैट

1
@CristianVat हां, लेकिन पैरामीटर है -XX:+PrintFlagsFinal, आपने जो सुझाव दिया था वह मेरे लिए काम नहीं करता है। इसे उत्तर में जोड़ना।
icza

सही, क्षमा करना -XX:+PrintFlagsFinalसबसे अच्छा विकल्प है क्योंकि इसमें सभी जानकारी को ध्यान में रखने के बाद सब कुछ दिखाना चाहिए (मैनुअल विकल्प और एर्गोनॉमिक्स सहित)। हालांकि -XX:+PrintCommandLineFlagsमेरे जेवीएम (सटीक संस्करण पर निर्भर हो सकता है) पर काम करने के लिए लगता है
क्रिस्टियान वैट

2
बड़े बक्से के लिए, अंगूठे का यह "1 / 4th रैम" नियम निश्चित रूप से पकड़ में नहीं आता है। 4-सॉकेट पर, 64 जीबी प्रति सॉकेट सर्वर (यानी 256 जीबी रैम), एक्सएमएक्स डिफॉल्ट से ~ 32 जीबी। 32 जीबी इस बिंदु पर भी कॉम्प्रेस्डऑप्स की सीमाओं से संबंधित हो सकता है।
फॉक्सफ़ॉक्स

2
यह केवल प्रिंट हीप आकार से संबंधित लाइनें हैं:java -XX:+PrintFlagsFinal -version | grep HeapSize
user218867

37

जैसा कि आपने उल्लेख किया है, डिफ़ॉल्ट -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'

इन डिफ़ॉल्ट मानों को आपकी इच्छित राशि पर भी अधिलेखित किया जा सकता है।



इस लिंक के अनुसार docs.oracle.com/javase/8/docs/technotes/guides/vm/… , न्यूनतम / प्रारंभिक के लिए डिफ़ॉल्ट 1/64 नहीं 1/6 है। "मशीन पर मशीन की भौतिक मेमोरी का
1/64

15

हैरानी की बात यह है कि इस सवाल का कोई निश्चित दस्तावेज नहीं है। शायद एक अन्य डेटा बिंदु एक जवाब की तलाश में दूसरों को मूल्य प्रदान करेगा। 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}

16 जीबी रैम के साथ मेरे सिस्टम में: 2069889024 = 2 जीबी।
david.perez

विंडोज 7 64 बिट 8 जीबी रैम के साथ: 32 बिट जेवीएम: 256 एमबी, 64 बिट जेवीएम: 2 जीबी
गोलिमार

अंत में इसके लिए दस्तावेज़ीकरण मिला: stackoverflow.com/a/56036202/32453
rogerdpack

2

मेरे Ubuntu वीएम पर, 1048 एमबी कुल रैम के साथ, java -XX:+PrintFlagsFinal -version | grep HeapSizeमुद्रित: uintx MaxHeapSize := 266338304जो लगभग 266 एमबी है और मेरे कुल रैम का 1 / 4th है।


2
यह मुझे देख रहा है जैसे कि OpenJDK और Oracle की अलग-अलग विशेषताएं हैं - मैं OpenJDK को हर समय 1/4 RAM का उपयोग करते हुए देखता हूं (कभी भी 1/4 और 1GB से छोटा नहीं होता)
9

1

के रूप में 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 वीएम पर निर्भर करता है, ऊपर।


1
अंत में असली मुद्राओं के लिंक जो बताते हैं कि क्या चल रहा है।
रॉगरडपैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.