दिलचस्प पोस्ट
पायथन डीबगर के साथ आरंभ करना, पीडीबी मैं आईपैड पर एचटीएमएल 5 स्थानीय स्टोरेज आकार में वृद्धि का अनुरोध कैसे कर सकता हूं, जैसे एफटी वेब ऐप करता है? सी ++ में टेल रिकर्सन कंस्ट्रक्टर से टेम्प्लेट पैरामीटर का अनुमान क्यों न करें? कोणीय HTML बाइंडिंग क्या आप JSON ऑब्जेक्ट में एक पीछे वाले अल्पविराम का उपयोग कर सकते हैं? स्ट्रिंग नाम का उपयोग किए बिना संपदा-बदले गए ईवेंट को कैसे बढ़ाएं PHP प्रकार हिंटिंग पर मैं एक "पकड़ने वाला गंभीर त्रुटि" कैसे पकड़ सकता हूं? NSPopover पर NSTextField को संपादित करने में सक्षम नहीं होने के बावजूद भी संपादन योग्य व्यवहार सेट है कैसे java.util.Properties में किसी अन्य प्रॉपर्टी को संदर्भित करें? स्कैनर डबल वैल्यू – इनपुट मेस्मेस्ट अपेशन मैं व्हाइटस्पेस कैसे ट्रिम कर सकता हूँ? सोलर बनाम इलास्टिक खोज Angularjs: इनपुट ngChange आग, जबकि मूल्य बदल रहा है कैसे पुनरावण इतिहास निर्यात करने के लिए मर्क्यूरीयल या जीआईटी से सीवीएस?

Windows XP पर जावा अधिकतम मेमोरी

मैं हमेशा 32-बिट विंडोज़ एक्सपी (जावा 1.4, 1.5 और 1.6) पर चलने वाली जावा एसई के लिए 1400 मेगाबाइट आवंटित करने में सक्षम हूं।

java -Xmx1400m ... 

आज मैंने जावा 1.5_16 और 1.6.0_07 का उपयोग करते हुए एक नया Windows XP मशीन पर एक ही विकल्प की कोशिश की और त्रुटि मिली:

 Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine. 

परीक्षण और त्रुटि के माध्यम से यह 1200 मेगाबाइट लगता है कि मैं इस मशीन पर सबसे अधिक आवंटित कर सकता हूं।

कोई विचार क्यों एक मशीन 1400 की अनुमति होगी और केवल 1200?

संपादित करें: इस मशीन में 4 जीबी रैम है जिसके बारे में 3.5 जीबी की पहचान की जा सकती है।

वेब के समाधान से एकत्रित समाधान "Windows XP पर जावा अधिकतम मेमोरी"

ध्यान रखें कि Windows में वर्चुअल मेमोरी प्रबंधन है और JVM को केवल स्मृति की आवश्यकता होती है जो उसके पता स्थान में संगत है । इसलिए, सिस्टम पर चलने वाले अन्य कार्यक्रमों को आपके ढेर के आकार को प्रभावित नहीं करना चाहिए। आपके रास्ते में क्या मिलेगा DLL जो आपके पते की जगह में लोड हो जाते हैं। दुर्भाग्य से विंडोज में ऑप्टिमाइज़ेशन जो लिंक करने के दौरान डीएलएल के स्थानांतरण को कम करता है, इससे अधिक संभावना है कि आपके पास एक विखंडित पता स्थान होगा। सामान्य सामानों से अलग आपके पते की जगह में कटौती करने वाली चीजें सुरक्षा सॉफ्टवेयर, सीबीटी सॉफ्टवेयर, स्पायवेयर और अन्य प्रकार के मैलवेयर शामिल हैं विभिन्न सुरक्षा पैच, सी रनटाइम संस्करण आदि की भिन्नताएं हैं। डिवाइस ड्राइवर और अन्य कर्नेल बिट्स का अपना पता स्थान है (4GB 32-बिट स्पेस का दूसरा 2 जीबी)।

आप अपनी जेएलएम प्रक्रिया में अपने डीएलएल बाइंडिंग के माध्यम से जाने की कोशिश कर सकते हैं और अपने डीएलएल को अधिक कॉम्पैक्ट एड्रेस स्पेस में रीबेस करने की कोशिश कर सकते हैं। मजाक नहीं है, लेकिन अगर आप निराश हैं …

वैकल्पिक रूप से, आप केवल 64-बिट Windows और 64-बिट JVM पर स्विच कर सकते हैं। दूसरों के सुझाव दिए जाने के बावजूद, जब तक यह अधिक रैम चबायेगा, तो आपके पास अधिक निकटतम वर्चुअल पता स्थान होगा, और 2 जीबी को आवंटित करना तुच्छ हो जाएगा।

यह संगत स्मृति के साथ क्या करना है

यहां कुछ जानकारी है जिसे मैंने किसी से पूछे जाने वाले किसी भी व्यक्ति के लिए ऑनलाइन पाया है , माना जाता है कि "वी एम ईश्वर" से पहले:

कारण ढेर के लिए हमें एक समीपनीय मेमोरी क्षेत्र की आवश्यकता है कि हमारे पास ढेर की शुरुआत से ही (स्केल किए गए) ऑफसेट्स द्वारा अनुक्रमित पक्ष डेटा संरचनाओं का एक गुच्छा है उदाहरण के लिए, हम ऑब्जेक्ट संदर्भ अपडेट को "कार्ड मार्क एरे" के साथ ट्रैक करते हैं जिसमें ढेर के प्रत्येक 512 बाइट्स के लिए एक बाइट है। जब हम ढेर में कोई संदर्भ संग्रहीत करते हैं, तो हमें कार्ड मार्क सरणी में संबंधित बाइट को चिह्नित करना होगा। हम स्टोर के गंतव्य पते को सही स्थानांतरित करते हैं और कार्ड चिह्न सरणी को इंडेक्स करने के लिए उपयोग करते हैं। आनन्द का अंकन अंकगणितीय गेम जिन्हें आप जावा में नहीं कर सकते हैं, आपको सी ++

आम तौर पर हमें मामूली निकटतम क्षेत्रों (लगभग 1.5 जीबी तक विंडो से, सोलारिस पर लगभग 3.8 जीबी तक) में परेशानी नहीं होती। वाईएमएमवी। विंडोह पर, समस्या ज्यादातर है कि कुछ लाइब्रेरी जो कि जेवीएम से शुरू होती है, इससे पहले पता लोड हो जाता है। / 3 जीबी स्विच का प्रयोग उन पुस्तकालयों को रिसाव नहीं करेगा, इसलिए वे अभी भी हमारे लिए एक समस्या है

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

विंडोज के लिए जावा ढेर आकार सीमाएं हैं:

  • 32-बिट जावा पर अधिकतम संभव ढेर आकार: 1.8 जीबी
  • 32-बिट जावा पर हीप आकार की सीमा की सिफारिश की गई : 1.5 जीबी (या 1.8 जीबी के साथ / 3 जीबी विकल्प)

यह बड़ा जावा ढेर लेने में आपकी मदद नहीं करता, लेकिन अब आप जानते हैं कि आप इन मूल्यों से परे नहीं जा सकते।

ओरेकल जेआरोकिट , जो गैर-संगत ढेर को नियंत्रित कर सकता है, में विंडोज़ 2003 / XP पर / 2. 3 जीबी स्विच के साथ 2.85 जीबी का एक जावा ढेर आकार हो सकता है। ऐसा लगता है कि विखंडन का बड़ा असर जावा जावा ढेर पर हो सकता है।

JVM को लगातार स्मृति की जरूरत है और क्या चल रहा है पर निर्भर करता है, जो पहले चल रहा था, और कैसे विंडोज़ ने मैनेजमेंट को प्रबंधित किया है आप 1.4 जीबी की लगातार मेमोरी तक पहुंच सकते हैं। मुझे लगता है कि 64 बिट विंडोज बड़े ढेर की अनुमति देगा।

सूर्य की जेवीवी को लगातार मेमोरी की आवश्यकता है इसलिए उपलब्ध स्मृति की अधिक मात्रा मेमोरी फ़्रेग्मेंटेशन से तय होती है। विशेष रूप से चालक के डीएलएस स्मृति को टुकड़ा करते हैं, जब कुछ पूर्वनिर्धारित आधार पता लोड होते हैं। तो आपके हार्डवेयर और उसके चालकों ने आपको कितनी मेमोरी मिल सकती है यह निर्धारित करते हैं।

सूर्य इंजीनियरों से बयान के साथ इसके दो स्रोत: फोरम ब्लॉग

शायद एक और जीवीएम? क्या आपने सद्भाव की कोशिश की है? मुझे लगता है कि उन्होंने गैर-निरंतर स्मृति को अनुमति देने की योजना बनाई थी

मुझे लगता है कि इसके साथ ऐसा करने के लिए अधिक है कि इस प्रतिक्रिया से संकेत दिए जाने के तरीके के अनुसार विंडोज कैसे कॉन्फ़िगर किया गया है: जावा-एक्सएमएक्स विकल्प

कुछ और परीक्षण: मैं केवल 768MB भौतिक RAM (और वर्चुअल मेमोरी) के साथ एक पुराने Windows XP मशीन पर 1300MB आवंटित करने में सक्षम था। मेरी 2 जीबी रैम मशीन पर मुझे केवल 1220 एमबी मिल सकता है कई अन्य कॉरपोरेट मशीनों (पुराने विंडोज एक्सपी के साथ) पर मुझे 1400 एमबी प्राप्त करने में सक्षम था 1220 एमबी की सीमा वाला मशीन बहुत ही नया है (सिर्फ डेल से खरीदा गया है), इसलिए हो सकता है कि इसमें नया (और अधिक फूला हुआ) विंडोज और डीएलएल (यह विंडो एक्सपी प्रो संस्करण 2002 एसपी 2 चल रहा है)

जब जावा प्रोग्राम को (सीमित मेमोरी) से चलाते समय मुझे यह त्रुटि संदेश मिला virtuozzo VPS मैंने किसी भी मेमोरी तर्क को निर्दिष्ट नहीं किया था, और पाया कि मुझे स्पष्ट रूप से एक छोटी सी राशि निर्धारित करनी थी क्योंकि डिफ़ॉल्ट बहुत अधिक होनी चाहिए। उदा- xmx32m (जाहिर है कि आपके द्वारा चलाए गए प्रोग्राम के आधार पर ट्यून होने की आवश्यकता है)।

बस इसे यहाँ डालने के मामले में किसी भी अन्य व्यक्ति को ऊपर की त्रुटि संदेश प्राप्त हो सकता है बिना प्रश्नकर्ता की तरह बड़ी मात्रा में मेमोरी निर्दिष्ट किए बिना

यदि आप एक विशाल ब्लॉक आवंटित करते हैं तो सूरज के जेडीके / जेआरई को एक निकटतम स्मृति की आवश्यकता होती है।

ओएस और शुरुआती क्षुधा लोड होने के दौरान बिट्स और टुकड़ों को आवंटित करते हैं जो कि उपलब्ध रैम के टुकड़े हैं। यदि एक निकटतम ब्लॉक उपलब्ध नहीं है, तो SUN JDK इसका उपयोग नहीं कर सकता। बीआरए (ओरेकल द्वारा अधिग्रहित) से जेआरकोट टुकड़ों से स्मृति आवंटित कर सकता है।

हर कोई लगातार स्मृति के बारे में जवाब दे रहा है, लेकिन एक और अधिक दबाव समस्या को स्वीकार करने के लिए उपेक्षित है।

यहां तक ​​कि 100% संचयी स्मृति आवंटन के साथ, आपके पास 32-बिट Windows OS (डिफ़ॉल्ट रूप से *) पर 2 GiB हेप आकार नहीं हो सकता है। इसका कारण यह है कि 32-बिट विंडोज़ प्रक्रिया 2 जीबी अंतरिक्ष से अधिक नहीं पता कर सकते।

जावा प्रक्रिया में पैरा जनरल (पूर्व जावा 8), स्टैक आकार प्रति धागा, जेवीएम / लाइब्रेरी ओवरहेड (जो प्रत्येक बिल्ड के साथ बहुत अधिक बढ़ता है) सभी ढेर के अतिरिक्त होगा

इसके अलावा, जेवीएम झंडे और उनके डिफ़ॉल्ट मान संस्करणों के बीच परिवर्तित होते हैं। बस निम्नलिखित को चलाएं और आपको कुछ विचार मिलेगा:

  java -XX:+PrintFlagsFinal 

बहुत सारे विकल्प ढेर के अंदर और बाहर मेमोरी डिवीजन को प्रभावित करते हैं। साथ खेलने के लिए आपको 2 जीबी से अधिक या कम छोड़कर …

मेरे इस उत्तर के भागों का पुन: उपयोग करने के लिए (टॉमकेट के बारे में, लेकिन किसी भी जावा प्रक्रिया पर लागू होता है):

विंडोज़ ओएस कुल 32 जीबी प्रक्रिया के स्मृति आबंटन को 2 जीबी कुल (डिफ़ॉल्ट रूप से) को सीमित करता है।

[आप केवल 1.5 गीब हेप स्पेस के आवंटन के लिए सक्षम होंगे] क्योंकि प्रक्रिया (जेवीएम / लाइब्रेरी ओवरहेड, पैरा जनरल स्पेस आदि) के लिए आवंटित अन्य स्मृति भी है।

32-बिट विंडोज एक 2 जीबी प्रोसेस एड्रेस स्पेस सीमा क्यों लगाती है, लेकिन 64-बिट विंडोज 4 जीबी की सीमा को लागू करती है?

अन्य आधुनिक ऑपरेटिंग सिस्टम [खांसे लिनक्स] 32-बीट प्रक्रियाओं को 4 जीआईबी पते वाले स्थान के सभी (या अधिकतर) का उपयोग करने की अनुमति देती है।

उस ने कहा, 64-बिट विंडोज़ ओएस को 32-बिट प्रक्रियाओं की सीमा को 4 GiB (32 GiB पर 3 GiB) तक बढ़ाने के लिए कॉन्फ़िगर किया जा सकता है:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx

यहां पेजिंग आकार को कैसे बढ़ाएं

  1. ठीक mycomputer —> गुण —> उन्नत पर क्लिक करें
  2. प्रदर्शन अनुभाग क्लिक सेटिंग में
  3. उन्नत टैब क्लिक करें
  4. वर्चुअल मेमोरी सेक्शन में, परिवर्तन पर क्लिक करें यह उर वर्तमान पेजिंग आकार दिखाएगा।
  5. वह ड्राइव चुनें जहां HDD स्थान उपलब्ध है।
  6. प्रारंभिक आकार और अधिकतम आकार प्रदान करें … जैसे प्रारंभिक आकार 0 MB और अधिकतम आकार 4000 MB। (जितना आप की आवश्यकता होगी उतना)

सबसे पहले, जब आपके पास 4 जीबी रैम है तो पेज-फाइल का इस्तेमाल करना बेकार है। विंडोज 4 जीबी (वास्तव में, कम मेमोरी होल्स की वजह से कम) तक नहीं पहुंच सकता है, इसलिए पृष्ठ फ़ाइल का उपयोग नहीं किया जाता है।

दूसरा, पता स्थान 2 में विभाजित है, कर्नेल के लिए आधे, उपयोगकर्ता मोड के लिए आधे। यदि आपको अपने अनुप्रयोगों के लिए अधिक रैम की आवश्यकता है तो Boot.ini में / 3GB विकल्प का उपयोग करें (सुनिश्चित करें कि java.exe को "बड़े पते की जानकारी" के रूप में चिह्नित किया गया है (अधिक जानकारी के लिए google)।

तीसरा, मुझे लगता है कि आप पूर्ण 2 जीबी पते के स्थान को आवंटित नहीं कर सकते हैं क्योंकि जावा आंतरिक रूप से कुछ स्मृति (थ्रेड, जेआईटी कंपाइलर, वीएम इनिशियलाइजिंग आदि) को अपशिष्ट करता है। अधिक के लिए / 3 जीबी स्विच का उपयोग करें