2009-10-06 13 views
16

Jruby का उपयोग करते समय, मुझे यह संदेश मिलता है।java.lang.OutOfMemoryError: जावा हीप स्पेस

Complete Java stackTrace 
java.lang.OutOfMemoryError: Java heap space 

कैसे हल करें?

+0

शायद आप ढेर पर कम वस्तुओं को आवंटित करना चाहते हैं। क्या आप एक कोड स्निपेट पोस्ट कर सकते हैं ताकि हम समझ सकें कि आप किस कोड को निष्पादित करने का प्रयास कर रहे हैं? –

+0

संभावित डुप्लिकेट [java.lang.OutOfMemoryError: जावा हीप स्पेस "त्रुटि (64 एमबी ढेर आकार) से निपटने के लिए कैसे करें] (http://stackoverflow.com/questions/37335/how-to-deal-with-java- लैंग-OutOfMemoryError-जावा-ढेर-अंतरिक्ष त्रुटि 64MB-ढेर) – Mark

उत्तर

2

आप कमांड लाइन पर एक बड़े आकार के लिए अपनी अधिकतम ढेर सेट कर सकते हैं:

java -Xmx512m MyClass 
1

या तो आप स्मृति लीक कर रहे हैं और तुम क्यों खोजने की जरूरत है या आप जावा अधिक ढेर जगह देने के लिए की जरूरत है:

java -Xmx512m ... 
9

आप धुन JVM ढेर आकार -Xmx और -Xms JVM विकल्पों का उपयोग कर सकते हैं: अधिकतम ढेर आकार के लिए -Xmx, और प्रारंभिक ढेर आकार के लिए -Xms। उदा .:

java -Xms128m -Xmx256m BigApp 

मैं आमतौर पर प्रारंभिक और अधिकतम ढेर आकार के लिए समान सेटिंग्स का उपयोग करता हूं।

आपके मामले में, यह कहना मुश्किल है कि आप क्या कर रहे हैं, इसके बारे में अधिक जानकारी के बिना JVM का आकार कैसे लें, जब समस्या होती है ... या हो सकता है कि आपके पास कहीं मेमोरी लीक हो और ढेर आकार बढ़ जाए मदद नहीं करेगा, यह समस्या बाद में हो जाएगी। इस मामले में, रिसाव को ठीक करने का एकमात्र समाधान है।

अंतिम कम से कम नहीं रहें, हमेशा ध्यान रखें कि जितना बड़ा होगा, उतना ही बड़ा जीसी

3

ढेर डंप आकार में वृद्धि केवल बैंड-सहायता हो सकती है। आप उचित उचित तर्क को जोड़कर एक हीप डंप उत्पन्न करने के लिए की जरूरत है:।

java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512 

यह एक फ़ाइल _ * HPROF जावा के समान उत्पन्न होगा। फिर आप ढेर डंप का विश्लेषण करने के लिए ओपन सोर्स टूल की एक आभासी का उपयोग कर सकते हैं। जावा 1.6 जेएचएटी के साथ जहाजों, जो कि प्रकार की छोटी गाड़ी है और बड़े ढेर का विश्लेषण नहीं करता है। मैं इस भयानक ग्रहण प्लगइन का उपयोग करता हूं: Eclipse Memory Analyzer

एक बार हेप डंप से एक रिपोर्ट उत्पन्न होती है, तो आप देख सकते हैं कि कौन सी कक्षाएं सबसे अधिक मेमोरी ले रही हैं और आप इसे किसी भी मेमोरी लीक को खोजने के लिए अपने कोड को डिबग करने के लिए प्रारंभिक बिंदु के रूप में उपयोग कर सकते हैं।

17

TLDR: jruby -J-Xmx1024m script_you_want_to_run.rb

दूसरों के रूप में उल्लेख किया है, अपने कार्यक्रम अधिकतम आकार JVM आवंटित करने के लिए अनुमति दी है और अधिक से अधिक स्मृति को आबंटित करने की कोशिश कर रहा है।

जैसा कि अन्य ने उल्लेख किया है, आप जावा को कॉन्फ़िगर कर सकते हैं ताकि इसे स्मृति -Xmx1024m (उदाहरण के रूप में) के साथ कमांड लाइन के माध्यम से बताकर अधिक मेमोरी आवंटन की अनुमति मिल सके।

-Xmx अधिकतम मेमोरी के लिए तर्क है, और 1024 मीटर स्मृति आकार (मेगाबाइट्स के लिए अंतिम मीटर) होगा। मुझे लगता है कि जेआरबीई पहले से ही 512 मीटर तक अधिकतम मेमोरी सेट के साथ जेवीएम शुरू करता है, इसलिए आप शायद उससे अधिक जा रहे हैं।

JRuby का उपयोग कर कमांड लाइन से JVM तर्क भेजने के लिए, यदि आप ऐसा अपने आदेश पंक्ति इस तरह दिखेगा, तर्क के सामने -J जोड़ने की आवश्यकता होगी:

jruby -J-Xmx1024m script_you_want_to_run.rb 

मैं भी मेमोरी रिसाव भावनाओं से सहमत हैं: यदि आप उम्मीद करते हैं कि आप इस त्रुटि को देख रहे हैं, तो आप वास्तव में ऑब्जेक्ट्स के टन से निपट नहीं रहे हैं, तो हो सकता है कि आप इस संभावना को देखना चाहें कि आपके प्रोग्राम में अनपेक्षित साइड इफेक्ट्स हैं।

1

संदेश "जावा हीप स्पेस" इंगित करता है कि जावा ऑप में नई ऑब्जेक्ट्स आवंटित नहीं की जा सकीं। त्रुटि जरूरी नहीं है कि एप्लिकेशन मेमोरी रिसाव। समस्या कॉन्फ़िगरेशन समस्या के रूप में सरल हो सकती है, जहां निर्दिष्ट ढेर आकार (या डिफ़ॉल्ट आकार, यदि निर्दिष्ट नहीं है) एप्लिकेशन के लिए अपर्याप्त है।

इस त्रुटि के संभावित स्रोतों और समाधान: http://www.blogsoncloud.com/jsp/techSols/java-lang-OutOfMemoryError-Java-heap-space.jsp

4

जांच इस आदेश के साथ JRuby की JVM संस्करण

jruby -v 

यदि यह इस स्ट्रिंग रिटर्न इसका मतलब है कि आप एक 32 बिट JVM उपयोग कर रहे हैं इसलिए आप अधिकतम ढेर आकार> = 2GB

jruby 1.7.3 (1.9.3p385) 2013-02-21 dac429b on Java HotSpot(TM) Client VM 1.6.0_37-b06 [Windows 7-x86] 

आप जावा के अपने 64 बिट संस्करण के लिए अपने JAVA_HOME निर्धारित करने की आवश्यकता करने के लिए सेट नहीं कर सकते। जैसे

set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_09 

आप निम्न उत्पादन देखेंगे अगर आप JRuby -v आदेश को फिर से रगड़

jruby 1.7.3 (1.9.3p385) 2013-02-21 dac429b on Java HotSpot(TM) 64-Bit Server VM 1.7.0_09-b05 [Windows 7-amd64] 

आप देख सकते हैं कि अब आप JVM के 64 बिट संस्करण का उपयोग कर रहे हैं। उसके बाद आप सेट कर सकते हैं या तो के रूप में

set JRUBY_OPTS=-J-Xmx2g 

इस प्रकार है या आप अपने कार्यक्रम चला सकते हैं के रूप में समाधान है कि मेरे लिए सबसे अच्छा काम किया स्थापना JRUBY_OPTS है

jruby -J-Xmx2g <your ruby program> 
+0

मैं भी '-S' ध्वज की जरूरत है, जैसे' JRuby -J-Xmx2g एस रेल रों puma' – Kris

9

इस प्रकार JRuby पर्यावरण पैरामीटर से छोड़ता है। कोरय के जवाब में इसका उल्लेख किया गया था।

set JRUBY_OPTS=-J-Xmx2g 
0

मुझे एक ही समस्या का सामना करना पड़ता है और मुझे कुछ घंटों तक गुगलने के बाद संतोषजनक समाधान नहीं मिल रहा है। यदि आपको केवल एक्सएमएस और एक्सएमएक्स पैरा सेट करना है, तो यहां मेरे लिए क्या काम करता है:

ps aux | grep java

पता लगाएं कि वास्तव में jruby द्वारा क्या चल रहा है। इसे मार डालो (kill -9 process_id)। कमांड लाइन पर देशी जावा विकल्पों के साथ कमांड को दोबारा चलाएं।

उम्मीद है कि यह मदद करता है।

वैसे, मैं रेल 4.0 पर जुर्बी के साथ प्यूमा सर्वर का उपयोग कर रहा हूं, और यदि कोई और अधिक सुरुचिपूर्ण समाधान जानता है, तो कृपया मुझे बताएं। मैंने सब कुछ करने की कोशिश की है (after_use_hook, .rvmrc, .bashrc, आदि इत्यादि)

धन्यवाद।

+0

आप से क्या मतलब है 'देशी जावा विकल्प '? – Richardsondx

संबंधित मुद्दे