डिफ़ॉल्ट अधिकतम जावा हीप आकार कैसे निर्धारित किया जाता है?


420

यदि मैं -Xmxnजावा कमांड लाइन से विकल्प को छोड़ देता हूं तो एक डिफ़ॉल्ट मान का उपयोग किया जाएगा। जावा प्रलेखन के अनुसार

"सिस्टम कॉन्फ़िगरेशन के आधार पर डिफ़ॉल्ट मान रनटाइम पर चुना जाता है"

क्या सिस्टम कॉन्फ़िगरेशन सेटिंग्स डिफ़ॉल्ट मान को प्रभावित करती हैं?


1
सिस्टम कॉन्फ़िगरेशन का अर्थ है: ए) क्लाइंट जेवीएम बनाम सर्वर जेवीएम बी) 32 बिट बनाम 64 बिट। लिंक: 1) J2SE5.0 docs.oracle.com/javase/6/docs/technotes/guides/vm/… 2 से संक्षिप्त विवरण) संक्षिप्त उत्तर: docs.oracle.com/javase/8/docs-technotes/guides/vm / gctuning /… 3) विस्तृत जवाब: docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/… 4) क्लाइंट बनाम सर्वर: javacodegeeks.com/07/jvm-options-client- vs-server.html
वैष्णव रमेश त्रिशूर

2
उपरोक्त लिंक से समझना कठिन है। तो उन्हें यहाँ संक्षेप में प्रस्तुत करना: क्लाइंट jvm के लिए अधिकतम ढेर का आकार 256mb है (ऊपर अपवाद है, ऊपर दिए गए लिंक से पढ़ें)। 32 बिट के सर्वर जेवीएम के लिए मैक्सिमुन हीप का आकार 1 जीबी है और 64 बिट 32 जीबी है (फिर से यहां पर भी आयन हैं। कृपया इसे लिंक से पढ़ें)। तो इसका 256mb या 1gb या 32gb
वैष्णव रमेश त्रिशूर

यह भी देखें stackoverflow.com/a/56036202/32453
rogerdpack

जवाबों:


505

विंडोज पर, आप सिस्टम पर उन डिफॉल्ट्स का पता लगाने के लिए निम्न कमांड का उपयोग कर सकते हैं जहां आपके एप्लिकेशन चलते हैं।

java -XX: + PrintFlagsFinal -version | HeapSize का पता लगाएं

विकल्प MaxHeapSize(के लिए -Xmx) और के InitialHeapSizeलिए देखो -Xms

यूनिक्स / लिनक्स सिस्टम पर, आप कर सकते हैं

java -XX: + PrintFlagsFinal -version | grep HeapSize

मेरा मानना ​​है कि परिणामी आउटपुट बाइट्स में है।


3
मैं इस तरह के एक अच्छे विकल्प की उम्मीद कर रहा था, लेकिन यह आईबीएम के जावा 6 वीएम का उपयोग करके मेरे लिए काम नहीं करता था।
मैट लाविन

महान! क्या मैं इन सभी डिफ़ॉल्ट विकल्पों के साथ खेल सकता हूं? प्रत्येक के लिए संबंधित ENV चर क्या है?
एलिस्ट

28
लिनक्स पर मेरे मामले में, InitialHeapSize = 262803264और अगर मैं गलत नहीं हूँ तो MaxHeapSize = 4206886912लगभग 256 एमबी और 4 जीबी है । क्या इसका मतलब यह है कि हर JVM शुरू होता है जैसे कि इसे -Xms256m -Xmx4gविकल्पों के साथ लॉन्च किया गया था ?
यूरी नकोनचैनी

9
एक विंडोज सिस्टम पर:java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
sp00m

1
मेरे लिनक्स पर @matanster -versionलंबे "उपयोग" पाठ को दबाता है stderr
फ्रैंकलिन यू

115

जावा एसई 5 के लिए: कचरा कलेक्टर एर्गोनॉमिक्स [ओरेकल] के अनुसार :

प्रारंभिक ढेर का आकार:

मशीन पर मशीन की भौतिक मेमोरी का 1/64 वाँ बड़ा या कुछ उचित न्यूनतम। J2SE 5.0 से पहले, डिफ़ॉल्ट प्रारंभिक हीप आकार एक उचित न्यूनतम था, जो प्लेटफ़ॉर्म द्वारा भिन्न होता है। आप -Xms कमांड-लाइन विकल्प का उपयोग करके इस डिफ़ॉल्ट को ओवरराइड कर सकते हैं।

अधिकतम ढेर का आकार:

भौतिक मेमोरी या 1 जीबी के 1/4 वें के छोटे। J2SE 5.0 से पहले, डिफ़ॉल्ट अधिकतम ढेर का आकार 64MB था। आप इस डिफ़ॉल्ट को -Xmx कमांड-लाइन विकल्प का उपयोग करके ओवरराइड कर सकते हैं।

अपडेट करें:

जैसा कि टॉम एंडरसन ने अपनी टिप्पणी में बताया है, उपरोक्त सर्वर-क्लास मशीनों के लिए है। एर्गोनॉमिक्स से 5.0 जावाटीएम वर्चुअल मशीन में :

J2SE प्लेटफॉर्म संस्करण 5.0 में मशीन के एक वर्ग को सर्वर-क्लास मशीन के रूप में संदर्भित किया गया है जिसे मशीन के रूप में परिभाषित किया गया है

  • 2 या अधिक भौतिक प्रोसेसर
  • भौतिक स्मृति के 2 या अधिक Gbytes

विंडोज ऑपरेटिंग सिस्टम के एक संस्करण को चलाने वाले 32 बिट प्लेटफार्मों को छोड़कर। अन्य सभी प्लेटफार्मों पर डिफ़ॉल्ट मान 1.4.2 संस्करण के लिए डिफ़ॉल्ट मानों के समान हैं।

J2SE प्लेटफ़ॉर्म संस्करण में 1.4.2 डिफ़ॉल्ट रूप से निम्नलिखित चयन किए गए थे

  • 4 Mbyte के प्रारंभिक ढेर का आकार
  • अधिकतम आकार 64 मेबेट का

4
कैविएट: यह सर्वर-क्लास मशीनों के लिए है, क्लाइंट-क्लास के लिए नहीं। आपको java.sun.com/docs/hotspot/gc5.0/ergo5.html के साथ उस दस्तावेज़ को पढ़ने की ज़रूरत है जो उन शर्तों को परिभाषित करता है और क्लाइंट-क्लास मशीनों के साथ क्या होता है। dogbane, क्या मैं विनम्रतापूर्वक आपको सुझाव दे सकता हूं कि आप अपने जवाब को संबंधित अंशों को उद्धृत करने के लिए संपादित करें?
टॉम एंडरसन

3
यह 2012 में एक हास्यास्पद कम डिफ़ॉल्ट है। बहुत कम गंभीर अनुप्रयोग 64 मेगाबाइट के अंदर फिट होंगे।
मार्क ई। हासे

1
जावा 6 अपडेट 18 के बाद क्लाइंट मशीनों के लिए अर्नेस्टो के अक्टूबर 30, 2012 का उत्तर देखें।
एंडी थॉमस

यह भी ध्यान रखें कि यह कहता है: "ढेर के आकार के लिए दी गई सीमाएं और अंश J2SE 5.0 के लिए सही हैं। बाद के रिलीज में उनके अलग होने की संभावना है क्योंकि कंप्यूटर अधिक शक्तिशाली होते हैं।"
Lodovik

वैसे, यह अहंकार केवल समानांतर कचरा कलेक्टर के लिए है।
माइक एर्गियोउ

45

Java 8 आपके Xmssize (न्यूनतम HeapSize) के लिए आपकी भौतिक मेमोरी का 1/64 वाँ हिस्सा लेता है और आपके -Xmxsize (अधिकतम HeapSize) के लिए आपकी भौतिक स्मृति के 1 / 4th से कम होता है ।

आप डिफ़ॉल्ट जावा हीप आकार की जांच कर सकते हैं :

में विंडोज :

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

में लिनक्स :

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

क्या सिस्टम कॉन्फ़िगरेशन सेटिंग्स डिफ़ॉल्ट मान को प्रभावित करती हैं?

मशीन की भौतिक मेमोरी और जावा संस्करण।


5
यह 1/6 के बजाय 1/64 नहीं है?
वैष्णव रमेश त्रिशूर

1
हाँ Xmssize (मिनिमम हैपसाइज़ / इनिशियलहेज़ाइज़) आपकी भौतिक मेमोरी का 1/64 वाँ हिस्सा है और Xmxsize (अधिकतम HeapSize / MaxHeapSize) आपकी भौतिक मेमोरी के 1 / 4th से कम है। (मेरे मैक के लिए पूर्व में, 16 जीबी रैम होने के कारण, मुझे यूनीटेक्स इनिशिएटिव मिल रहा है: = 268435456 {उत्पाद} uintx MaxHeapSize: = 4294967296 {उत्पाद}, i, e Xms 268 MB है और Xmx 4.29 GB है
sjethvani

1
कृपया उत्तर संपादित करें। यह 1/64 वां है, 1/6 वां नहीं।
पन्नाधाय

35

यह जावा 6 अपडेट 18 में बदल गया है ।

यह मानते हुए कि हमारे पास 1 जीबी से अधिक भौतिक मेमोरी है (इन दिनों काफी आम है), यह सर्वर vm के लिए आपकी भौतिक मेमोरी का हमेशा 1 / 4th है।


8
गलत, जुड़ा हुआ पेज कहता हैgreater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
पाओलो फुलगोनी

5
मैंने अभी 5gb भौतिक मेमोरी के साथ एक linux मशीन पर जाँच की है। डिफ़ॉल्ट अधिकतम ढेर शो 1.5gb के रूप में
ernesto

1
@PaoloFulgoni नहीं, एक और व्यावहारिक उदाहरण जो मैं अभी देख रहा हूं: 129 गीबाइट्स ऑफ फिजिकल मेमोरी रिजल्ट्स इन 32 गब्ते ऑफ मैक्स हाइप साइज
किरिल

क्यों यह सही है के लिए apl का उत्तर देखें : stackoverflow.com/a/13310792/32453 यह भी देखें stackoverflow.com/a/56036202/32453
rogerdpack

16

अर्नेस्टो सही है। लिंक के अनुसार उन्होंने पोस्ट किया:

अपडेटेड क्लाइंट JVM हीप कॉन्फ़िगरेशन

क्लाइंट JVM में ...

  • डिफ़ॉल्ट अधिकतम ढेर आकार 192 मेगाबाइट के भौतिक मेमोरी आकार तक भौतिक मेमोरी का आधा है और अन्यथा 1 गीगाबाइट के भौतिक मेमोरी आकार तक भौतिक मेमोरी का एक चौथाई है।

    उदाहरण के लिए, यदि आपकी मशीन में 128 मेगाबाइट भौतिक मेमोरी है, तो अधिकतम ढेर का आकार 64 मेगाबाइट है, और भौतिक मेमोरी के 1 गीगाबाइट से अधिक या बराबर 256 मेगाबाइट का अधिकतम ढेर आकार होता है।

  • अधिकतम ढेर आकार वास्तव में जेवीएम द्वारा उपयोग नहीं किया जाता है जब तक कि आपका कार्यक्रम इसकी आवश्यकता के लिए पर्याप्त ऑब्जेक्ट नहीं बनाता है। एक बहुत छोटी राशि, जिसे प्रारंभिक हीप आकार कहा जाता है, जेवीएम आरंभीकरण के दौरान आवंटित की जाती है। ...

  • ...
  • सर्वर JVM हीप कॉन्फ़िगरेशन एर्गोनॉमिक्स अब क्लाइंट के समान है, सिवाय इसके कि 32-बिट जेवीएम के लिए डिफ़ॉल्ट अधिकतम हीप आकार 1 गीगाबाइट है , जो 4 गीगाबाइट की भौतिक मेमोरी आकार के अनुरूप है, और 64-बिट जेवीएम के लिए 32 गीगाबाइट है , इसी 128 गीगाबाइट के भौतिक स्मृति आकार के लिए।

[१] http://www.oracle.com/technetwork/java/javase/6u18-142093.html


9

IBM JVM के लिए, कमांड निम्नलिखित है:

java -verbose:sizes -version

Java 8 के लिए IBM SDK के बारे में अधिक जानकारी के लिए: http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appendes/defaults.html ? लैंग = hi


लगता है लिंक (प्रभावी रूप से) टूट गया है।
पीटर मोर्टेंसन

@PeterMortensen ने अभी जाँच की - लिंक ठीक है
n0mer

8

आखिरकार!

जावा 8u191 के अनुसार अब आपके पास विकल्प हैं:

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

प्रयोग करने योग्य भौतिक रैम के प्रतिशत के रूप में ढेर को आकार देने के लिए इसका उपयोग किया जा सकता है। (जो रैम के समान है जिसे कर्नेल कम उपयोग करता है)।

अधिक जानकारी के लिए Java8 u191 के रिलीज़ नोट देखें । ध्यान दें कि विकल्पों का उल्लेख एक डॉकर हेडिंग के तहत किया गया है लेकिन वास्तव में वे लागू होते हैं चाहे आप डॉकर वातावरण में हों या पारंपरिक वातावरण में।

के लिए डिफ़ॉल्ट मान MaxRAMPercentage25% के है। यह अत्यंत रूढ़िवादी है।

मेरा अपना नियम: यदि आपका होस्ट दिए गए जावा एप्लिकेशन को चलाने के लिए अधिक या कम समर्पित है, तो आप समस्याओं के बिना नाटकीय रूप से बढ़ सकते हैं। यदि आप लिनक्स पर हैं, केवल मानक डेमॉन चला रहे हैं और 1 जीबी और आसपास के कहीं से रैम स्थापित किया है तो मैं जेवीएम के ढेर के लिए 75% का उपयोग करने में संकोच नहीं करूंगा। फिर, याद रखें कि यह उपलब्ध रैम का 75% है , रैम स्थापित नहीं है । जो बचा है वह अन्य उपयोगकर्ता भूमि प्रक्रियाएं हैं जो मेजबान पर चल रही हैं और अन्य प्रकार की मेमोरी जो जेवीएम की जरूरत है (जैसे स्टैक के लिए)। सभी एक साथ, यह आमतौर पर 25% में अच्छी तरह से फिट होगा जो बचा हुआ है। जाहिर है, अधिक स्थापित रैम के साथ 75% एक सुरक्षित और सुरक्षित शर्त है। (काश JDK लोगों ने एक विकल्प लागू किया होता जहाँ आप एक सीढ़ी निर्दिष्ट कर सकते थे)

MaxRAMPercentageविकल्प सेट करना इस तरह दिखता है:

java -XX:MaxRAMPercentage=75.0  ....

ध्यान दें कि ये प्रतिशत मान 'डबल' प्रकार के हैं और इसलिए आपको उन्हें दशमलव डॉट के साथ निर्दिष्ट करना होगा। यदि आप "75.0" के बजाय "75" का उपयोग करते हैं, तो आपको कुछ विषम त्रुटि मिलती है।


7

डिफ़ॉल्ट मान सिस्टम कॉन्फ़िगरेशन के आधार पर रनटाइम पर चुना जाता है

प्रलेखन पृष्ठ पर एक नज़र है

डिफ़ॉल्ट ढेर का आकार

जब तक प्रारंभिक और अधिकतम ढेर के आकार को कमांड लाइन पर निर्दिष्ट नहीं किया जाता है, तब तक उनकी गणना मशीन पर मेमोरी की मात्रा के आधार पर की जाती है।

  1. क्लाइंट JVM डिफ़ॉल्ट प्रारंभिक और अधिकतम हीप आकार:

    डिफ़ॉल्ट अधिकतम ढेर आकार 192 मेगाबाइट्स (एमबी) के भौतिक मेमोरी आकार तक भौतिक मेमोरी का आधा है और अन्यथा 1 गीगाबाइट (जीबी) के भौतिक मेमोरी आकार तक भौतिक मेमोरी का एक चौथाई है

  2. सर्वर JVM डिफ़ॉल्ट प्रारंभिक और अधिकतम हीप आकार:

    32-बिट JVM पर , डिफ़ॉल्ट अधिकतम हीप आकार 1 जीबी तक हो सकता है यदि 4 जीबी या अधिक भौतिक मेमोरी है64-बिट JVM पर, डिफ़ॉल्ट अधिकतम हीप आकार 32 जीबी तक हो सकता है यदि 128 जीबी या अधिक भौतिक मेमोरी है

क्या सिस्टम कॉन्फ़िगरेशन सेटिंग्स डिफ़ॉल्ट मान को प्रभावित करती हैं?

आप झंडे -Xms (प्रारंभिक ढेर आकार) और -Xmx (अधिकतम ढेर आकार) का उपयोग करके प्रारंभिक और अधिकतम हीप आकार निर्दिष्ट कर सकते हैं । क्या आप जानते हैं कि कितना ढेर आपके आवेदन अच्छी तरह से काम करने की जरूरत है, तो आप सेट कर सकते हैं -Xms और -Xmx एक ही मूल्य के लिए


5

Xmsऔर Xmxजावा आभासी मशीन के हैं ध्वज (JVM):

  • Xms: initial and minimumजेवीएमheap size
    • Format: -Xmx<size>[g|G|m|M|k|K]
    • Default Size:
      • -server मोड: मुफ्त भौतिक मेमोरी का 25%,> = 8 एमबी और <= 64 एमबी
      • -client mode: 25% मुफ्त भौतिक स्मृति,> = 8 एमबी और <= 16 एमबी
    • Typical Size:
      • -Xms128M
      • -Xms256M
      • -Xms512M
    • Function/ Effect:
      • -> JVM Xmsआकार के आवंटन के साथ शुरू होता है
  • Xmx: maximumजेवीएमheap size
    • Format: -Xmx<size>[g|G|m|M|k|K]
    • Default Size:
      • <= R27.2
        • Windows: 75%कुल भौतिक स्मृति तक1GB
        • Linux/Solaris: 50%उपलब्ध भौतिक स्मृति तक1GB
      • >= R27.3
        • Windows X64: 75%कुल भौतिक स्मृति तक2GB
        • Linux/Solaris X64: 50%उपलब्ध भौतिक स्मृति तक2GB
        • Windows x86: 75%कुल भौतिक स्मृति तक1GB
        • Linux/Solaris X86: 50%उपलब्ध भौतिक स्मृति तक1GB
    • Typical Size:
      • -Xmx1g
      • -Xmx2084M
      • -Xmx4g
      • -Xmx6g
      • -Xmx8g
    • Function/ Effect:
      • -> जेवीएम अधिकतम Xmxआकार की मेमोरी का उपयोग करने की अनुमति देता है
        • जब चाहोगे Xmx, करोगेjava.lang.OutOfMemoryError
          • कैसे ठीक करें OutOfMemoryError?
            • Xmxमूल्य से अधिक है
              • उदाहरण के लिए: से -Xmx4gकरने के लिए-Xmx8g

ज्यादा जानकारी

आधिकारिक डॉक देखें: -X कमांड-लाइन विकल्प


JRockit JVM के लिए नहीं है? (जैसा कि ओरेकल के हॉटस्पॉट जेवीएम के विपरीत है)
पीटर

4

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

यहां छवि विवरण दर्ज करें

डिफ़ॉल्ट रूप से, वर्चुअल मशीन प्रत्येक संग्रह में ढेर को बढ़ाती है या सिकोड़ती है और एक विशिष्ट सीमा के भीतर प्रत्येक संग्रह में जीवित वस्तुओं के लिए मुक्त स्थान के अनुपात को रखने की कोशिश करती है। यह लक्ष्य सीमा पैरामीटर द्वारा प्रतिशत के रूप में सेट की गई है - XX:MinHeapFreeRatio=<minimum>और -XX:MaxHeapFreeRatio=<maximum>, और कुल आकार नीचे -Xms<min>और ऊपर से नीचे तक सीमित है -Xmx<max>

पैरामीटर डिफ़ॉल्ट मान

MinHeapFreeRatio 40

MaxHeapFreeRatio 70

-Xms 3670k

-एक्सएमएक्स 64 मी

64-बिट सिस्टम पर ढेर आकार के मापदंडों के डिफ़ॉल्ट मूल्यों को लगभग 30% तक बढ़ाया गया है। यह वृद्धि 64-बिट सिस्टम पर वस्तुओं के बड़े आकार के लिए क्षतिपूर्ति करने के लिए है।

इन मापदंडों के साथ, यदि एक पीढ़ी में मुक्त स्थान का प्रतिशत 40% से कम हो जाता है, तो पीढ़ी का अधिकतम अनुमत आकार तक 40% मुक्त स्थान बनाए रखने के लिए पीढ़ी का विस्तार किया जाएगा। इसी तरह, यदि खाली स्थान 70% से अधिक है, तो पीढ़ी को अनुबंधित किया जाएगा ताकि केवल 70% स्थान खाली हो, पीढ़ी के न्यूनतम आकार के अधीन।

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

  • जब तक आपको रुकावट की समस्या न हो, वर्चुअल मशीन को यथासंभव मेमोरी देने की कोशिश करें। डिफ़ॉल्ट आकार (64MB) अक्सर बहुत छोटा होता है।
  • वर्चुअल मशीन से सबसे महत्वपूर्ण नौकरशाही के निर्णय को हटाकर एक ही मान पर सेटिंग -Xms और -Xmx बढ़ जाती है। हालांकि, वर्चुअल मशीन तब खराब होने पर क्षतिपूर्ति करने में असमर्थ होती है।
  • सामान्य तौर पर, मेमोरी बढ़ाएं क्योंकि आप प्रोसेसर की संख्या बढ़ाते हैं, क्योंकि आवंटन को समानांतर किया जा सकता है।

    नहीं है पूरा लेख

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