"Java.lang.OutOfMemoryError: जावा हीप स्पेस" त्रुटि से निपटने के लिए कैसे करें(64 एमबी ढेर आकार)




java-ee jvm (12)

आखिरकार आपके पास हमेशा उपयोग करने के लिए ढेर का एक सीमित अधिकतम होता है चाहे आप किस प्लेटफॉर्म पर चल रहे हों। विंडोज 32 बिट में यह लगभग 2 जीबी है (विशेष रूप से ढेर नहीं बल्कि प्रति प्रक्रिया मेमोरी की कुल मात्रा)। ऐसा होता है कि जावा डिफ़ॉल्ट रूप से छोटा चुनने का विकल्प चुनता है (संभवतः प्रोग्रामर ऐसे प्रोग्राम नहीं बना सकता है जिनके पास इस समस्या में भाग लेने के बिना रनवे मेमोरी आवंटन है और वे यह जांच कर रहे हैं कि वे क्या कर रहे हैं)।

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

इस मामले में आप यह निर्धारित करने के लिए जावा मेमोरी प्रोफाइलर का उपयोग कर सकते हैं कि आपके प्रोग्राम में कौन सी विधियां बड़ी संख्या में ऑब्जेक्ट आवंटित कर रही हैं और फिर यह निर्धारित करने का कोई तरीका है कि अब उनका संदर्भ नहीं दिया गया है, या उन्हें पहले स्थान पर आवंटित नहीं किया गया है। एक विकल्प जिसे मैंने अतीत में उपयोग किया है वह है "जेएमपी" http://www.khelekore.org/jmp/

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

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

मैं जावा 5 पर क्लाइंट-साइड स्विंग एप्लिकेशन (ग्राफिकल फ़ॉन्ट डिजाइनर) लिख रहा हूं। हाल ही में, मैं java.lang.OutOfMemoryError: Java heap space में चल रहा हूं java.lang.OutOfMemoryError: Java heap space त्रुटि क्योंकि मैं स्मृति उपयोग पर रूढ़िवादी नहीं हूं। उपयोगकर्ता असीमित फ़ाइलों को खोल सकता है, और प्रोग्राम खुली वस्तुओं को स्मृति में रखता है। एक त्वरित शोध के बाद मुझे 5.0 जावा वर्चुअल मशीन में एर्गोनॉमिक्स और अन्य लोगों ने विंडोज मशीन पर कहा कि जेवीएम 64MB रूप में अधिकतम ढेर आकार को डिफ़ॉल्ट करता है।

इस स्थिति को देखते हुए, मुझे इस बाधा से कैसे निपटना चाहिए?

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

मैं स्मृति को मुक्त करने के लिए ऑब्जेक्ट को लगातार सिस्टम (डेटाबेस का उपयोग करना एक ही चीज़) के लिए ऑब्जेक्ट्स को जारी रखने के लिए अपने कुछ कोड को फिर से लिख सकता हूं। यह काम कर सकता है, लेकिन शायद यह भी बहुत काम है।

यदि आप मुझे उपरोक्त विचारों के विवरण या स्वचालित वर्चुअल मेमोरी जैसे कुछ विकल्पों को इंगित कर सकते हैं , तो ढेर आकार को गतिशील रूप से विस्तारित करना , यह बहुत अच्छा होगा।


आप प्रति परियोजना निर्दिष्ट कर सकते हैं कि आपकी परियोजना कितनी ढेर जगह चाहता है

ग्रहण हेलीओस / जूनो / केप्लर के लिए निम्नलिखित है:

दायां माउस क्लिक करें

 Run As - Run Configuration - Arguments - Vm Arguments, 

फिर इसे जोड़ें

-Xmx2048m

ग्रहण में वीएम तर्क ने मेरे लिए काम किया। यदि आप ग्रहण संस्करण 3.4 का उपयोग कर रहे हैं, तो निम्न कार्य करें

Run --> Run Configurations --> फिर -Xmx1024m बिल्ड के तहत प्रोजेक्ट का चयन करें -> फिर टैब " -Xmx1024m " चुनें -> फिर -Xmx1024m दर्ज -Xmx1024m

वैकल्पिक रूप से आप Run --> Run Configurations --> select the "JRE" tab --> Xmx1024m Run --> Run Configurations --> select the "JRE" tab --> कर सकते हैं Run --> Run Configurations --> select the "JRE" tab --> फिर दर्ज करें - Xmx1024m

इससे सभी बिल्डों / परियोजनाओं के लिए मेमोरी ढेर बढ़ाना चाहिए। उपरोक्त स्मृति आकार 1 जीबी है। आप जिस तरह से चाहते हैं उसे अनुकूलित कर सकते हैं।


जावा में OutOfMemoryError को हल करने का आसान तरीका JVM विकल्प -Xmx512M का उपयोग कर अधिकतम ढेर आकार को बढ़ाने के लिए है, यह तुरंत आपके -Xmx512M को हल करेगा। यह मेरा पसंदीदा समाधान है जब मुझे परियोजना के निर्माण के दौरान एक्लिप्स, मेवेन या एएनटी में आउटऑफमेमरी एरर मिलता है क्योंकि प्रोजेक्ट के आकार के आधार पर आप आसानी से मेमोरी से बाहर हो सकते हैं।

यहां JVM के अधिकतम ढेर आकार को बढ़ाने का एक उदाहरण दिया गया है, इसके अलावा यदि आप अपने जावा एप्लिकेशन में ढेर आकार सेट कर रहे हैं तो एक्सएक्सएक्स-एक्सएमएस राशन या तो 1: 1 या 1: 1.5 रखने के लिए बेहतर है।

export JVM_ARGS="-Xms1024m -Xmx1024m"

संदर्भ लिंक


ध्यान दें कि यदि आपको तैनाती की स्थिति में इसकी आवश्यकता है, तो जावा वेबस्टार्ट ("ऑनडिस्क" संस्करण के साथ, नेटवर्क एक नहीं - जावा 6u10 और बाद में संभव है) का उपयोग करने पर विचार करें क्योंकि यह आपको एक क्रॉस में JVM के विभिन्न तर्क निर्दिष्ट करने की अनुमति देता है मंच रास्ता

अन्यथा आपको एक ऑपरेटिंग सिस्टम विशिष्ट लॉन्चर की आवश्यकता होगी जो आपको आवश्यक तर्क सेट करता है।


नीचे दिए गए चरणों का पालन करें:

  1. टोमकैट / बिन से catalina.sh खोलें।

  2. Chnage JAVA_OPTS करने के लिए

    JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m 
    -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m 
    -XX:MaxPermSize=256m -XX:+DisableExplicitGC"
    
  3. अपने टोमकैट को पुनरारंभ करें


बिग चेतावनी ---- मेरे कार्यालय में, हम उसे ढूंढ रहे थे (कुछ विंडोज मशीनों पर) हम जावा ढेर के लिए 512m से अधिक आवंटित नहीं कर सके। यह उन मशीनों में से कुछ पर स्थापित कैस्पर्सकी एंटी-वायरस उत्पाद के कारण हुआ। एवी उत्पाद को अनइंस्टॉल करने के बाद, हमने पाया कि हम कम से कम 1.6 जीबी आवंटित कर सकते हैं, यानी, -Xmx1600m (एम अनिवार्य है अन्यथा यह एक और त्रुटि "बहुत छोटा प्रारंभिक ढेर") काम करेगा।

कोई एहसास नहीं है कि यह अन्य एवी उत्पादों के साथ होता है लेकिन संभवतः यह हो रहा है क्योंकि एवी प्रोग्राम प्रत्येक पता स्थान में स्मृति का एक छोटा सा ब्लॉक आरक्षित कर रहा है, जिससे एकल वास्तव में बड़े आवंटन को रोक दिया जा सके।


मुझे जावा ढेर आकार की एक ही समस्या का सामना करना पड़ा है। यदि आप जावा 5 (1.5) का उपयोग कर रहे हैं तो मेरे पास दो समाधान हैं।

पहला: -just jdk1.6 इंस्टॉल करें और ग्रहण की प्राथमिकताओं पर जाएं और आपके द्वारा इंस्टॉल किए गए jav1 1.6 के jre पथ को सेट करें।

दूसरा: - अपने वीएम तर्क की जांच करें और इसे जो कुछ भी हो, उसे चलो। वीएम तर्कों में मौजूद सभी तर्कों के नीचे बस एक पंक्ति जोड़ें -Xms512m -Xmx512m -XX: MaxPermSize = ... m (1 9 2 मीटर)।

मुझे लगता है यह उचित होगा...


मैंने कहीं और पढ़ा है कि आप कोशिश कर सकते हैं - java.lang.OutOfMemoryError और पकड़ ब्लॉक पर, आप उन सभी संसाधनों को मुक्त कर सकते हैं जिन्हें आप जानते हैं, स्मृति, करीबी कनेक्शन और बहुत आगे का उपयोग कर सकते हैं, फिर System.gc () करें आप जो भी करने जा रहे थे उसे पुनः प्रयास करें।

एक और तरीका यह है हालांकि, मुझे नहीं पता कि यह काम करेगा या नहीं, लेकिन मैं वर्तमान में परीक्षण कर रहा हूं कि यह मेरे आवेदन पर काम करेगा या नहीं।

आइडिया System.gc () को कॉल करके कचरा संग्रह करना है जो मुफ्त मेमोरी बढ़ाने के लिए जाना जाता है। मेमोरी गोबलिंग कोड निष्पादित करने के बाद आप इसे जांचते रह सकते हैं।

//Mimimum acceptable free memory you think your app needs
long minRunningMemory = (1024*1024);

Runtime runtime = Runtime.getRuntime();

if(runtime.freeMemory()<minRunningMemory)
 System.gc();

यदि आप ऑब्जेक्ट को संदर्भ आवंटित करते रहते हैं और रखते हैं, तो आप अपनी स्मृति की किसी भी राशि को भर देंगे।

एक विकल्प एक पारदर्शी फ़ाइल को टैब स्विच करते समय बंद और खोलना है (आप केवल फ़ाइल में पॉइंटर रखते हैं, और जब उपयोगकर्ता टैब स्विच करता है, तो आप सभी ऑब्जेक्ट को बंद और साफ़ करते हैं ... यह फ़ाइल को धीमा कर देगा ... लेकिन ...), और शायद स्मृति पर केवल 3 या 4 फाइलें रखें।

दूसरी बात यह है कि जब आप उपयोगकर्ता को फ़ाइल खोलते हैं, इसे लोड करते हैं, और किसी आउटऑफमेमरी त्रुटि को रोकते हैं, तो (फ़ाइल को खोलना संभव नहीं है) उस फ़ाइल को बंद करें, अपनी ऑब्जेक्ट्स को साफ करें और उपयोगकर्ता को चेतावनी दें कि उसे अप्रयुक्त बंद करना चाहिए फ़ाइलें।

वर्चुअल मेमोरी को गतिशील रूप से विस्तारित करने का आपका विचार समस्या को हल नहीं करता है, क्योंकि मशीन संसाधनों पर सीमित है, इसलिए आपको सावधान रहना चाहिए और स्मृति समस्याओं को संभालना चाहिए (या कम से कम, उनके साथ सावधान रहना चाहिए)।

मेमोरी लीक के साथ मैंने देखा कुछ संकेत है:

-> ध्यान रखें कि यदि आप किसी संग्रह में कुछ डालते हैं और बाद में इसके बारे में भूल जाते हैं, तो आपके पास अभी भी इसका एक मजबूत संदर्भ है, इसलिए संग्रह को रद्द करें, इसे साफ़ करें या इसके साथ कुछ करें ... यदि नहीं, तो आपको कोई नहीं मिलेगा स्मृति रिसाव खोजने के लिए मुश्किल है।

-> शायद, कमजोर संदर्भों के साथ संग्रह का उपयोग करके (weakhashmap ...) स्मृति समस्याओं के साथ मदद कर सकता है, लेकिन आपको इसके साथ सावधान रहना चाहिए, क्योंकि आप पाते हैं कि जिस ऑब्जेक्ट को आप ढूंढ रहे हैं उसे एकत्रित किया गया है।

-> एक और विचार जो मैंने पाया है वह एक सतत संग्रह विकसित करना है जो कम से कम उपयोग और पारदर्शी रूप से लोड की गई डेटाबेस ऑब्जेक्ट्स पर संग्रहीत है। यह शायद सबसे अच्छा दृष्टिकोण होगा ...


यदि यह समस्या Wildfly 8 और JDK1.8 में हो रही है, तो हमें PermGen सेटिंग्स के बजाय MaxMetaSpace सेटिंग्स निर्दिष्ट करने की आवश्यकता है।

उदाहरण के लिए हमें जंगली उड़ान की setenv.sh फ़ाइल में नीचे कॉन्फ़िगरेशन जोड़ने की आवश्यकता है। JAVA_OPTS="$JAVA_OPTS -XX:MaxMetaspaceSize=256M"

अधिक जानकारी के लिए, कृपया वाइल्डफ्लाई हीप इश्यू की जांच करें


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

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

-XX:ParallelGCThreads=8
-XX:+CMSClassUnloadingEnabled
-XX:InitiatingHeapOccupancyPercent=70
-XX:+UnlockDiagnosticVMOptions
-XX:+UseConcMarkSweepGC
-Xms512m
-Xmx8192m
-XX:MaxPermSize=256m (in java 8 optional)

उदाहरण के लिए: उत्पादन मोड के लिए लिनक्स प्लेटफॉर्म पर बेहतर सेटिंग्स।

इस तरह से सर्वर को डाउनलोड और कॉन्फ़िगर करने के बाद http://www.ehowstuff.com/how-to-install-and-setup-apache-tomcat-8-on-centos-7-1-rhel-7/

1. फ़ोल्डर / opt / tomcat / bin / पर setenv.sh फ़ाइल बनाएं

   touch /opt/tomcat/bin/setenv.sh

2. बेहतर मोड सेट करने के लिए इस पैरा को खोलें और लिखें।

nano  /opt/tomcat/bin/setenv.sh 

export CATALINA_OPTS="$CATALINA_OPTS -XX:ParallelGCThreads=8"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+CMSClassUnloadingEnabled"
export CATALINA_OPTS="$CATALINA_OPTS -XX:InitiatingHeapOccupancyPercent=70"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UnlockDiagnosticVMOptions"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseConcMarkSweepGC"
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx8192m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxMetaspaceSize=256M"

3. service tomcat restart

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





heap-memory