"Java.lang.OutOfMemoryError: Java हीप स्पेस" त्रुटि से कैसे निपटें?


416

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

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

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

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

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


64 एमबी का डिफ़ॉल्ट अधिकतम ढेर का आकार J2SE 5.0 से पहले का है। J2SE 8.0 जानकारी के लिए, "कचरा संग्रहकर्ता एर्गोनॉमिक्स" को डॉक्स.कोरल . com / javase / 8 / docs / technotes / guides / vm/… पर देखें
एंडी थॉमस

यदि आप यहां पर उतरे हैं क्योंकि हर OOM प्रश्न इस पर आधारित है, तो सुनिश्चित करें कि आप भी देखें: stackoverflow.com/questions/299659/… यह OOM से ठीक पहले 'समय में' मेमोरी संदर्भों की सफाई के लिए समाधान प्रदान करता है। SoftReferences उपकरण हो सकता है जो आपकी वास्तविक समस्या को हल करता है।
स्टीव स्टेनर

जवाबों:


244

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

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

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

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

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


6
OpenJDK और OracleJDK ने प्रोफाइलर - jvisualvm को बंडल किया है। यदि आप अधिक उपयुक्तता चाहते हैं, तो मैं वाणिज्यिक Yourkit का सुझाव दूंगा।
पेट्र ग्लैडिख

121

कमांड-लाइन विकल्प के साथ जावा चलाएं -Xmx, जो ढेर का अधिकतम आकार निर्धारित करता है ।

विवरण के लिए यहां देखें


3
इस पैरामीटर को हमेशा के लिए कैसे सेट करें? क्योंकि मैं 'gradlew assemble' कमांड का उपयोग कर रहा हूँ।
डॉ। जैकी

2
रन-> रन कॉन्फ़िगरेशन-> तर्क पर क्लिक करें-> वीएम तर्कों के अंदर टाइप करें -Xms1g -Xmx2g
Arayan Singh

2
यही असली जवाब है।
NCCC

85

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

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

राइट माउस पर क्लिक करें

 Run As - Run Configuration - Arguments - Vm Arguments, 

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

-Xmx2048m

1
हाय bighostkim और cuongHuyTo, जहां "तर्क" है .. मैं रन कॉन्फ़िगरेशन तक देख सकता हूं। कृपया मुझे दूर करें। मुझे जीमेल से लगभग 2000 संपर्कों को डाउनलोड करने और संग्रहीत करने की आवश्यकता है। यह स्मृति अपवाद से बाहर होने के कारण दुर्घटनाग्रस्त हो गया
AndroidRaji

@AndroiRaji: आप अपने माउस को जावा क्लास पर राइट क्लिक करते हैं, जिसमें एक रनवेबल मेन होता है (जो कि "पब्लिक स्टैटिक शून्य मेन (स्ट्रिंग [] args)") है, फिर रन अस - रन कॉन्फ़िगरेशन चुनें। तब "आर्ग्युमेंट्स" मेन के ठीक बाद वाला टैब है (आप टैब मेन, आर्ग्यूमेंट्स, जेआरई, क्लासपैथ, सोर्स, एनवायरनमेंट, कॉमन देखें)।
CuongHuyTo 10

47

ढेर का आकार बढ़ाना "फिक्स" नहीं है यह एक "प्लास्टर" है, 100% अस्थायी है। यह फिर से कहीं और दुर्घटनाग्रस्त हो जाएगा। इन मुद्दों से बचने के लिए, उच्च प्रदर्शन कोड लिखें।

  1. जहाँ भी संभव हो, स्थानीय चर का उपयोग करें।
  2. सुनिश्चित करें कि आप सही ऑब्जेक्ट का चयन करते हैं (EX: स्ट्रिंग, स्ट्रिंगर और स्ट्रिंग के बीच चयन)
  3. अपने प्रोग्राम के लिए एक अच्छे कोड सिस्टम का उपयोग करें (EX: स्टैटिक वेरिएबल्स VS नॉन स्टैटिक वैरिएबल का उपयोग करना)
  4. अन्य सामान जो आपके कोड पर काम कर सकते हैं।
  5. मल्टी थ्रैडिंग के साथ स्थानांतरित करने का प्रयास करें

ये बिल्कुल सही है। मैं एक मुद्दे को ठीक करने की कोशिश कर रहा हूं जहां मुझे AWT धागे पर OOM मिल रहा है लेकिन अगर मैं अलग नए धागे का उपयोग करता हूं, तो मुझे OOM मुद्दा नहीं मिल रहा है। सभी मुझे पता है कि AWT धागे के लिए ढेर का आकार बढ़ सकता है।
आशीष

@ एश: हां, प्लास्टर की तलाश के बजाय कोर समस्या को ठीक करें।
नींबू का रस

कचरा संग्रह और जावा में मेमोरी प्रबंधन दृष्टिकोण को अपने पूर्ववर्तियों की इन सभी मॉलोक-डीललॉक जटिलताओं को हल करना चाहिए था :( बेशक मैं इस जवाब से पूरी तरह सहमत हूं कि यह सिर्फ एक शर्म की बात है कि चूक से दुबला डेटा के साथ कोड लिखना आसान नहीं है -एस्ट्रैप जो एएसएपी से साफ किए जाते हैं।
दावोस

31

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

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


22

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

करने के लिए जाना Run --> Run Configurations -->तो maven निर्माण के तहत परियोजना का चयन -> फिर टैब "JRE" का चयन करें -> फिर enter -Xmx1024m

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

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


18

हां, -Xmxआप अपने JVM के लिए अधिक मेमोरी कॉन्फ़िगर कर सकते हैं। यह सुनिश्चित करने के लिए कि आप मेमोरी को लीक या बेकार नहीं करते हैं। एक ढेर डंप लें और अपनी मेमोरी खपत का विश्लेषण करने के लिए ग्रहण मेमोरी एनालाइज़र का उपयोग करें


JVMJ9VM007E कमांड-लाइन विकल्प अपरिचित: -Xmx जावा वर्चुअल मशीन नहीं बना सका। डाउनवोट
फिलिप रेगो

17

मैं ऑर्किल परेशानी शूटिंग लेख से सिफारिशें जोड़ना चाहूंगा ।

थ्रेड थ्रेड_name में अपवाद: java.lang.OutOfMemoryError: Java हीप स्पेस

विस्तार संदेश जावा हीप स्पेस इंगित करता है कि ऑब्जेक्ट जावा हीप में आवंटित नहीं किया जा सकता है। यह त्रुटि जरूरी नहीं कि मेमोरी लीक हो

संभावित कारण:

  1. सरल कॉन्फ़िगरेशन समस्या , जहां निर्दिष्ट हीप आकार अनुप्रयोग के लिए अपर्याप्त है।

  2. अनुप्रयोग अनायास ही वस्तुओं के संदर्भ में होता है , और यह वस्तुओं को कचरा एकत्र होने से रोकता है।

  3. फाइनल का अत्यधिक उपयोग

इस त्रुटि का एक अन्य संभावित स्रोत उन अनुप्रयोगों के साथ उत्पन्न होता है जो अंतिम रूप से अत्यधिक उपयोग करते हैं। यदि किसी वर्ग के पास एक अंतिम विधि है, तो उस प्रकार की वस्तुओं को कचरा संग्रहण के समय पुनः प्राप्त नहीं किया जाता है

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

एक परिदृश्य जो इस स्थिति का कारण बन सकता है, जब कोई एप्लिकेशन उच्च प्राथमिकता वाले थ्रेड बनाता है जिसके कारण अंतिमकरण कतार उस दर से अधिक होती है जो उस दर से अधिक तेज़ होती है जिस पर अंतिम पंक्ति उस कतार की सर्विसिंग करती है।


9

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

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

  2. 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. अपने टॉमकैट को फिर से शुरू करें


8

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

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

Idea को 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();

6
सामान्य तौर पर मुझे लगता है कि JVM एक OutOfMemoryError को फेंकने के बजाय कचरा संग्रहण (GC) को पसंद करेंगे। स्पष्ट रूप से OutOfMemoryError के बाद System.gc () को कॉल करने से संभवतः कुछ VMs / कॉन्फ़िगरेशन पर मदद मिल सकती है, लेकिन मुझे उम्मीद नहीं होगी कि यह सामान्य मामले में बहुत अच्छा काम करेगा। हालांकि, अनावश्यक वस्तु संदर्भों को छोड़ने से लगभग सभी मामलों में मदद मिलेगी।
माइक क्लार्क

6
कोड से सीधे @mwangi कॉलिंग System.gc () आमतौर पर एक बुरा विचार है। यह सिर्फ एक सुझाव है जेवीएम को है कि जीसी का प्रदर्शन किया जाना चाहिए, लेकिन इसकी कोई गारंटी नहीं है कि यह प्रदर्शन किया जाएगा।

7

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

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

export JVM_ARGS="-Xms1024m -Xmx1024m"

संदर्भ लिंक


1
कोई भी विचार क्यों हमें उन्हें 1: 1 या 1: 1.5 अनुपात में रखने की आवश्यकता है?
इर्नस्टो

7

डिफ़ॉल्ट रूप से विकास के लिए 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. सेट setenv.sh फ़ोल्डर पर फ़ाइल / ऑप्ट / tomcat / bin /

   touch /opt/tomcat/bin/setenv.sh

2.Open और बेहतर मोड की स्थापना के लिए इस परम को लिखें।

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 केवल ढेर की तुलना में अधिक मेमोरी का उपयोग करता है। उदाहरण के लिए जावा विधि, थ्रेड स्टैक्स और देशी हैंडल को ढेर से अलग मेमोरी, साथ ही जेवीएम आंतरिक डेटा संरचनाओं में आवंटित किया जाता है।


7

मैंने जावा हीप साइज़ से समान समस्या का सामना किया है।

मेरे पास दो समाधान हैं यदि आप जावा 5 (1.5) का उपयोग कर रहे हैं।

  1. बस jdk1.6 स्थापित करें और ग्रहण की वरीयताओं पर जाएं और jav1 1.6 का jre पथ सेट करें जैसा आपने स्थापित किया है।

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

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


7

यदि आपको रनटाइम पर अपने मेमोरी उपयोग की निगरानी करने की आवश्यकता है, तो java.lang.managementपैकेज की पेशकश का MBeansउपयोग आपके वीएम में मेमोरी पूल की निगरानी करने के लिए किया जा सकता है (जैसे, एडेन स्पेस, टेनड पीढ़ी आदि), और कचरा संग्रह व्यवहार भी।

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

अंततः, आपका सबसे अच्छा शर्त यह है कि आपकी मेमोरी रिटेंशन को सीमित किया जाए जहां तक ​​संभव हो कि प्रदर्शन स्वीकार्य रहे। पिछली टिप्पणी के रूप में, स्मृति हमेशा सीमित होती है, लेकिन आपके ऐप में मेमोरी थकावट से निपटने के लिए एक रणनीति होनी चाहिए।


5

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

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


Java WebStart को चरणबद्ध किया जा रहा है। मुझे उपयुक्त प्रतिस्थापन के बारे में अभी जानकारी नहीं है।
थोरबजर्न रावन एंडरसन

1

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

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

अधिक जानकारी के लिए, कृपया Wildfly हीप समस्या की जाँच करें


1

नेटबीन्स के संबंध में, आप समस्या को हल करने के लिए अधिकतम ढेर आकार निर्धारित कर सकते हैं।

'रन' पर जाएं, फिर>> 'प्रोजेक्ट कॉन्फ़िगरेशन सेट करें' -> 'पॉपुलेटेड विंडो' का 'कस्टमाइज़' -> 'रन' करें -> 'VM विकल्प' -> भरें '-Xms2048m -Xmx2048m' ।


1

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

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

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

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

स्मृति लीक के साथ मैंने देखा संकेत के एक जोड़े है:

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

-> हो सकता है, कमज़ोर संदर्भों (weakhashmap ...) के साथ संग्रह का उपयोग करके स्मृति समस्याओं के साथ मदद की जा सकती है, लेकिन आपको चाहिए इसके साथ सावधानी , क्योंकि आप पा सकते हैं कि आपके द्वारा गई वस्तु एकत्र की गई है।

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


0

यदि सब कुछ विफल रहता है, तो अधिकतम हीप आकार बढ़ाने के अलावा स्वैप आकार को बढ़ाने का भी प्रयास करें। लिनक्स के लिए, अब तक, प्रासंगिक निर्देश https://linuxize.com/post/create-a-linux-swap-file/ में पाए जा सकते हैं ।

यदि आप उदाहरण के लिए एक एम्बेडेड प्लेटफॉर्म में कुछ बड़ा संकलन कर रहे हैं तो यह मदद कर सकता है।

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