2012-06-21 14 views
6

मैं ग्रहण कार्यों में समय-समय पर चल रहा हूं जिसके लिए बहुत बड़ी मात्रा में स्मृति की आवश्यकता होती है। तो jvm जबकि कार्य चल रहा है 2-3 जीबी रैम निगल, यह ठीक है। लेकिन एक बार जब जेवीएम ने उस स्मृति को लिया तो यह इसे जारी नहीं करता है और मेरे पास एक स्थिति है जब ढेर में स्मृति का उपयोग लगभग 200 एमबी है जिसमें कुल ढेर आकार 3 जीबी है और यह वास्तव में अवांछित है क्योंकि अन्य कार्यक्रम स्मृति के लिए भूख से मर रहे हैं।मूल जेवीएम को मूल मेमोरी वापस करने के लिए

मैंने अप्रयुक्त स्मृति की खपत को कम करने के लिए jvm को मजबूर करने के लिए Max/MinHeapFreeRatio पैरामीटरों का प्रयास किया। यह मेरा ग्रहण config.ini फ़ाइल है:

-startup 
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar 
--launcher.library 
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.100.v20110502 
-vm 
c:/Program Files/Java/jdk1.6.0_26/bin/javaw.exe 
-showlocation 
-product 
org.eclipse.epp.package.jee.product 
--launcher.defaultAction 
openFile 
--launcher.XXMaxPermSize 
256M 
-showsplash 
org.eclipse.platform 
--launcher.XXMaxPermSize 
256m 
--launcher.defaultAction 
openFile 
-vmargs 
-Duser.name=Michael Nesterenko 
-Dosgi.requiredJavaVersion=1.5 
-Xms512m 
-Xmx4096m 
-XX:MinHeapFreeRatio=10 
-XX:MaxHeapFreeRatio=30 

लेकिन वह मदद नहीं करता है, मैं अभी भी स्थितियों है जब वहाँ अप्रयुक्त स्मृति के बहुत सारे हैं।

+0

क्या ग्रहण-गहन कार्यों को करने के लिए पैरामीटर के विभिन्न सेटों के साथ ग्रहण शुरू करने के लिए दो अलग-अलग शॉर्ट-कट/शेल-स्क्रिप्ट हैं? –

उत्तर

4

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

जावा इसकी मेमोरी उपयोग को कॉम्पैक्ट करेगा ताकि पहले से उपयोग किए गए कई पेजों को डिस्क पर बदला जा सके, हालांकि यह फिर से उनकी आवश्यकता होने पर एक महत्वपूर्ण प्रदर्शन हिट हो सकता है।

+5

मैं असहमत हूं। स्मृति कम हो सकती है। इस डॉक्टर से (http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html): '-XX: MaxHeapFreeRatio = 70 \t जीसी के बाद सिकुड़ने से बचने के लिए हीप मुक्त का अधिकतम प्रतिशत। 'इसका मतलब है कि 70% से अधिक ढेर मुक्त है तो ढेर कम हो जाएगा। इसके अलावा इस बग रिपोर्ट के अनुसार (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6498735): 'हॉटस्पॉट जेवीएम पहले से ही लाइव जावा ऑब्जेक्ट्स के लिए आवश्यक नहीं होने पर मेमोरी को ऑपरेटिंग सिस्टम पर वापस छोड़ देगा । –

+0

उपयोग किया गया ढेर कम हो जाएगा, हालांकि आवेदन का निवासी आकार नहीं है। 'मुझे नहीं पता कि बग समीक्षक किस बारे में बात कर रहा है। मैंने वर्चुअल मेमोरी पदचिह्न को कभी भी नहीं देखा है। ' –

+0

वास्तव में वर्चुअल मेमोरी कोई समस्या नहीं है, यह किसी भी आकार का हो सकता है, क्योंकि यह प्रक्रिया निजी है। मुझे प्रक्रिया कार्य सेट को कम करने की आवश्यकता है - यह भौतिक RAM उपयोग है। –

0

मेरा सुझाव है कि आप "stolsvik" इस जावा बग/RFE पर की टिप्पणियों के 2 पढ़ा - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6498735 यह कुछ लंबाई कैसे -XX:MinHeapFreeRatio और -XX:MaxHeapFreeRatio विकल्प काम में बताते हैं।

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


एक संभावित समस्या जो स्मृति रिलीज को गंभीर रूप से बाधित कर सकती है वह जेवीएम द्वारा गैर-ढेर स्मृति का आवंटन है; जैसे धागे के ढेर, देशी कोड ढेर या सीधे मैप किए गए बफर के लिए।

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