java - वस्तु ढेर के लिए पर्याप्त जगह आरक्षित नहीं कर सका




jvm heap (17)

जब मैं दौड़ रहा हूं, तब भी जब मैं प्रोग्राम चलाने की कोशिश करता हूं तो मुझे बार-बार निम्नलिखित अपवाद मिल रहा है।

वीएम की शुरुआत के दौरान त्रुटि हुई

वस्तु ढेर के लिए पर्याप्त जगह आरक्षित नहीं कर सका

जावा वर्चुअल मशीन नहीं बन सकी।

मैंने अपनी वर्चुअल मेमोरी (पेज साइज) और रैम साइज को बढ़ाने की कोशिश की, लेकिन इसका कोई फायदा नहीं हुआ। क्या कोई मुझे बता सकता है कि मैं इस त्रुटि को कैसे खत्म कर सकता हूं?


त्रुटि:

त्रुटि के लिए, "vm के प्रारंभ के दौरान त्रुटि हुई वस्तु ऑब्जेक्ट हेप jboss के लिए पर्याप्त स्थान आरक्षित नहीं कर सका"

मूल कारण :

  • नीचे उल्लिखित हमारे जेवीएम को अनुचित / अपर्याप्त स्मृति आवंटन।

  • उदाहरण के लिए JAVA_OPTS = "- Xms1303m -Xmx1303m -XX: MaxPermSize = 256m" jboss-eap-6.2 \ bin \ standalone.conf या "JAVA_OPTS = -Xms1G -Xmx1G -XX: MaxPermSize = 256M" jboss-eap-6.2 \ bin में \ standalone.conf.bat जो कि जेवीएम मेमोरी आवंटन पूल पैरामीटर के अलावा कुछ भी नहीं है।

संकल्प :

  • ढेर आकार बढ़ाएं। ढेर के आकार को बढ़ाने के लिए,
  • goto -> jboss-eap-6.2 \ bin \ standalone.conf.bat या jboss-eap-6.2 \ bin \ standalone.conf
  • बदलें -> JAVA_OPTS = "- Xms256m -Xmx512m -XX: MaxPermSize = 256m" जहां -Xms न्यूनतम ढेर आकार है और -Xmx अधिकतम ढेर आकार है।
  • आमतौर पर इसे न्यूनतम और अधिकतम के लिए समान आकार रखने की अनुशंसा नहीं की जाती है।

  • यदि आप ग्रहण से अपना आवेदन चला रहे हैं,

  • सर्वर पर डबल क्लिक करें
  • 'ओपन लॉन्च कॉन्फ़िगरेशन' का चयन करें, आपको 'लॉन्च कॉन्फ़िगरेशन गुण संपादित करें' विंडो पर रीडायरेक्ट किया जाएगा।
  • इस विंडउन में टैब '(x) = Arguments' मिला है।
  • वीएम तर्कों में, नीचे वर्णित अपने ढेर आकार को परिभाषित करें
  • "-Dprogram.name = JBossTools: जेबॉस ईएपी 6.1+ रनटाइम सर्वर" -सेवर -Xms256m -Xmx512m -XX: MaxPermSize = 256m -Dorg.jboss.resolver.warning = true

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

जावा के 64-बिट संस्करण को स्थापित करने से इन मामलों में मदद मिलती है, संगत स्मृति आवश्यकता केवल 32-बिट जावा पर लागू होती है।


कभी-कभी यह संबंधित है

$ sysctl vm.overcommit_memory
vm.overcommit_memory = 2

यदि आप इसे यहां सेट करते हैं:

$ sysctl vm.overcommit_memory=0

यह काम करना चाहिए।


कभी-कभी, यह त्रुटि इंगित करती है कि सर्वर पर भौतिक स्मृति और स्वैप वास्तव में पूरी तरह से उपयोग किया जाता है!

मैं हाल ही में 48 जीबी रैम के साथ RedHat Enterprise Linux 5.7 चला रहे सर्वर पर इस समस्या को देख रहा था। मैंने पाया कि यहां तक ​​कि बस चल रहा है

java -version

एक ही त्रुटि हुई, जिसने स्थापित किया कि समस्या मेरे आवेदन के लिए विशिष्ट नहीं थी।

चल रहा है

cat /proc/meminfo

रिपोर्ट किया गया है कि MemFree और SwapFree क्रमशः MemTotal और SwapTotal मानों में से 1% से कम थे:

MemTotal:     49300620 kB
MemFree:        146376 kB
...
SwapTotal:     4192956 kB
SwapFree:         1364 kB

मशीन पर कुछ अन्य चल रहे अनुप्रयोगों को रोकने से कुछ हद तक मुक्त मेमोरी आंकड़े सामने आए:

MemTotal:     49300620 kB
MemFree:       2908664 kB
...
SwapTotal:     4192956 kB
SwapFree:      1016052 kB

इस बिंदु पर, जावा का एक नया उदाहरण ठीक से शुरू होगा, और मैं अपना आवेदन चलाने में सक्षम था।

(जाहिर है, मेरे लिए, यह सिर्फ एक अस्थायी समाधान था; मेरे पास अभी भी उस मशीन पर चल रही प्रक्रियाओं की अधिक गहन परीक्षा करने का एक उत्कृष्ट कार्य है, यह देखने के लिए कि नाममात्र स्मृति उपयोग स्तर को कम करने के लिए कुछ किया जा सकता है या नहीं आवेदन रोकने के लिए रिसॉर्ट करने के लिए।)


नीचे की तरह पीओएम फ़ाइल में सिर्फ कुछ भी करने की ज़रूरत नहीं है

<configuration>
    <maxmemory>1024M</maxmemory>
</configuration>

मान लीजिए कि आपकी कक्षा पैकेज पैकेज में Test कहा जाता है। अपना कोड इस तरह चलाएं:

java -Xmx1024m mypackage.Test

यह आपके कोड के लिए 1024 एमबी हेप स्पेस आरक्षित करेगा। यदि आप 512 एमबी चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

java -Xmx512m mypackage.Test

1024m मीटर, 512m , आदि में थोड़ा मीटर का प्रयोग करें


मुझे इसी तरह का मुद्दा था। मैंने 64 बिट मशीन पर जावा के 32 बिट संस्करण को स्थापित किया था। उस संस्करण को अनइंस्टॉल करने और जावा के 64 बिट संस्करण को स्थापित करने पर। मैं इस मुद्दे को हल करने में सक्षम था।


मुझे एक ही त्रुटि मिली और जब मैंने% temp% का उपयोग करके अस्थायी फ़ाइलों को हटा दिया और ग्रहण को पुनरारंभ किया तो यह हल हो गया।


मुझे पता है कि यहां पहले से बहुत सारे जवाब हैं, लेकिन उनमें से कोई भी मेरी मदद नहीं करता है। अंत में मैंने फ़ाइल /etc/elasticsearch/jvm.options खोला और बदल दिया:

-Xms2G
-Xmx2G

सेवा मेरे

-Xms256M
-Xmx256M

यह मेरे लिए हल हो गया। उम्मीद है कि यह किसी और की मदद करता है।


मुझे हाल ही में इस मुद्दे का सामना करना पड़ा। मेरे पास 3 जावा एप्लिकेशन हैं जो 1024 मीटर या 1280 मीटर ढेर आकार से शुरू होते हैं। जावा स्वैप में उपलब्ध स्थान को देख रहा है, और यदि पर्याप्त स्मृति उपलब्ध नहीं है, तो जेवीएम निकलता है।

इस मुद्दे को हल करने के लिए, मुझे कई कार्यक्रमों को समाप्त करना पड़ा जिनमें आवंटित वर्चुअल मेमोरी की बड़ी मात्रा थी।

मैं 64-बिट जेवीएम के साथ x86-64 लिनक्स पर चल रहा था।


यदि आप 32 बिट जेवीएम चला रहे हैं, तो ढेर आकार को छोटे से बदलकर मदद करें। आप जावा को सीधे या पर्यावरण चर के माध्यम से तर्कों को पारित करके ऐसा कर सकते हैं,

java -Xms128M -Xmx512M
JAVA_OPTS="-Xms128M -Xmx512M"

64 बिट जेवीएम के लिए, बड़े ढेर आकार जैसे -Xms512M -Xmx1536M काम करना चाहिए।

Java7 के लिए java -version या java -d32 , java--d64 ताकि आप यह देख java--d64 कि आप कौन सा संस्करण चला रहे हैं।


यदि आप जावा प्रोग्राम चला रहे हैं: - लिनक्स के लिए सही कमांड का उपयोग करके टर्मिनल में अपना प्रोग्राम चलाएं, यह 'जावा -जर myprogram.jar' और ऐड -Xms256m -Xmx512m होगा, उदाहरण के लिए: 'जावा -jar myprogram.jar Xms256m -Xmx512m '

यदि आप एक .sh स्क्रिप्ट (लिनक्स, मैक?) या एक .bat स्क्रिप्ट (विंडोज़) चला रहे हैं तो स्क्रिप्ट खोलें और यदि वे मौजूद हैं और स्मृति को बढ़ाएं तो जावा विकल्पों की तलाश करें।

यदि उपर्युक्त सभी काम नहीं करते हैं, तो अपनी प्रक्रियाओं को जांचें (ctrl + alt + windows पर हटाएं) (लिनक्स / मैक पर ps aux) और उन प्रक्रियाओं को मार दें जो स्मृति के आवंटन का उपयोग करते हैं और आपके ऑपरेटिंग सिस्टम के लिए आवश्यक नहीं हैं! => अपने प्रोग्राम को फिर से चलाने का प्रयास करें।


यह सुनिश्चित करने के लिए कि आप 64-बिट वीएम चला रहे हैं, -Xmx512M उपयोग -d64 के साथ संयुक्त। 64-बिट मशीन पर मैंने सोचा कि मैं 64-बिट वर्चुअल मशीन चला रहा था, लेकिन नहीं। 64-बिट जावा स्थापित करने के बाद -d64 विकल्प काम करता है और -Xmx बहुत अधिक मेमोरी आकार की अनुमति देता है।

java -d64 -Xmx512M mypackage.Test

यहां इसे ठीक करने का तरीका बताया गया है:

  • स्टार्ट-> कंट्रोल पैनल-> ​​सिस्टम-> उन्नत (टैब) -> पर्यावरण वैरिएबल-> सिस्टम पर जाएं

_JAVA_OPTIONS > नया: परिवर्तनीय नाम: _JAVA_OPTIONS

परिवर्तनीय मूल्य: -Xmx512M

परिवर्तनीय नाम: Path
परिवर्तनीय मान: %PATH%;C:\Program Files\Java\jre6\bin;F:\JDK\bin;

इसे अपने उचित रास्ते में बदलें।


वैसे भी, इसे ठीक करने का तरीका यहां दिया गया है: स्टार्ट-> नियंत्रण कक्ष-> सिस्टम-> उन्नत (टैब) -> पर्यावरण चर-> सिस्टम वैरिएबल-> नया: परिवर्तनीय नाम: _JAVA_OPTIONS परिवर्तनीय मान: -Xmx512M

या

नीचे दिखाए गए अनुसार एंटी कॉल बदलें।

   <exec
        **<arg value="-J-Xmx512m" />**
    </exec>

यह मेरे लिए काम किया।


स्टार्ट-> कंट्रोल पैनल-> ​​सिस्टम-> उन्नत (टैब) -> पर्यावरण वैरिएबल-> सिस्टम वैरिएबल-> नया:

परिवर्तनीय नाम: _JAVA_OPTIONS परिवर्तनीय मान: -Xmx512M


-Xmx2G^ bin निर्देशिका में cassandra.bat फ़ाइल में -Xms512M^ या किसी भी बड़े स्मृति आकार को बदलें।





heap