2012-06-20 11 views
8

मेरे पास एक जावा प्रोग्राम है जो 5 अलग-अलग कार्यों को करता है। जब मैं -Xmx512m मेमोरी पैरामीटर के साथ प्रोग्राम चलाता हूं, तो कार्य 1-4 ठीक चलता है लेकिन कार्य 5 स्मृति से बाहर हो जाता है। जब मैं -Xmx1024m के साथ प्रोग्राम चलाता हूं, तो सभी 5 कार्य ठीक चलते हैं लेकिन 512 एम ढेर के साथ पहले ठीक से चलने वाले कार्यों में अब लगभग 1024 मीटर ढेर का उपयोग होता है। अगर मैं -Xms128m -Xmx1024m का उपयोग करता हूं तो वही बात होती है।मेमोरी पदचिह्न को यथासंभव कम रखने के लिए JVM को कैसे निर्देशित करें?

स्मृति उपयोग को कम रखने के लिए जेवीएम को निर्देशित करने के लिए स्मृति पैरामीटर क्या होगा (उदाहरण के लिए कार्य 1-4 के लिए 512m) और वास्तव में आवश्यक होने पर अधिक मेमोरी का उपयोग करने के लिए (जैसे कार्य 5 के मामले में)?

शायद मुझे डिफ़ॉल्ट सेटिंग की तुलना में कचरा कलेक्टर को सक्रिय करने के लिए एक तरीका चाहिए?

+0

आप कैसे अंतर कर रहे हैं कि कौन से कार्यों का उपयोग स्मृति की मात्रा का उपयोग करता है? – Poindexter

+0

इससे कोई फ़र्क क्यों पड़ता है कि कितना कार्य 1-4 उपयोग करता है? वैसे भी आप पूरे कार्यक्रम के लिए पहले से ही एक गीगाबाइट आवंटित कर चुके हैं। –

+0

@Poindexter मैं एक कमांड लाइन पैरामीटर पास करता हूं यह इंगित करने के लिए कि कौन सा कार्य चलाना है। फिर मैं कार्यक्रम के स्मृति उपयोग को देखने के लिए 'prstat' का उपयोग करता हूं। – Raihan

उत्तर

5

मुझे लगता है कि आपको JVM काम करने के तरीके पर गलतफहमी है। यह एक जीसी मुद्दा या "कार्य" मुद्दा नहीं है।

आपके कार्यों में मेमोरी लीक है या वे अधिक से अधिक स्मृति को पकड़ने के लिए डिज़ाइन किए गए हैं।

-Xmx1024m अधिकतम स्मृति को जेएमएम आवंटित कर सकता है सेट करता है। यह वही बात होगी जैसे आपके पास केवल 1024 मेगापिक्सल भौतिक मेमोरी है और वर्चुअल मेमोरी नहीं है।

कार्य की परिभाषा के साथ अपने प्रश्न को अपडेट करना सहायक होगा। क्या ये 5 अलग जेवीएम हैं? या एक एकल JVM में काम के केवल 5 इकाइयां।

अद्यतन

मैं इस कार्यक्रम सभी 1g ढेर हमेशा उपयोग करने का इरादा नहीं है। मेरा इरादा है कि जेवीएम को 512 एम ढेर का उपयोग करने के लिए निर्देश देना है यदि आवश्यक हो तो केवल और मेमोरी का उपयोग कर सकते हैं। जब स्मृति की आवश्यकता नहीं होती है, तो 512 मीटर या यहां तक ​​कि कम मात्रा में स्मृति गिरने के लिए।

सिर्फ इसलिए कि आप सेट करते हैं -Xmx1024m का मतलब यह नहीं है कि JVM सभी स्मृति का उपयोग करेगा। यह सिर्फ अधिकतम सीमा है। एक्सएमएस सेट करने के लिए न्यूनतम मात्रा में स्मृति सेट करने के लिए सेट अप करें। आपका कार्यक्रम आखिरकार उपयोग की जा रही स्मृति की चलती मात्रा निर्धारित करता है। यदि यह -एक्सएमएक्स द्वारा निर्धारित सीमा को हिट करता है तो यह आउटऑफमेमरी एरर

फेंक देगा आप System.gc() का आह्वान करके कचरा कलेक्टर चलाने के लिए JVM को सुझाव दे सकते हैं। नोटिस मैंने सुझाव दिया, आप जीसी को चलाने के लिए मजबूर नहीं कर सकते हैं। आप ऐसे मंच पर चल रहे हैं जो जीसी करने से इनकार कर देता है। आपको यह भी देखना होगा कि जीसी एल्गोरिदम आपके एप्लिकेशन के लिए क्या चुन रहा है। मैं यहां Tuning Garbage Collector देखता हूं।

यदि आपको स्मृति उपयोग पर ऐसे अच्छे अनाज नियंत्रण की आवश्यकता है तो आपको JVM के अलावा कुछ और चुनना होगा।

+0

जब मैं प्रोग्राम चलाता हूं, तो मैं एक कमांड लाइन पैरामीटर पास करता हूं जो दर्शाता है कि प्रोग्राम में से कौन से 5 कार्य निष्पादित हैं। कार्यक्रम के जीवनकाल के दौरान, अनुरोधित कार्य चलाते समय, मैं प्रोग्राम के स्मृति उपयोग की निगरानी करता हूं। कार्य 1-4 के मामले में, जब मैं -Xmx512m का उपयोग करता हूं, तो मुझे लगता है कि पूरा होने से पहले मेमोरी उपयोग लगभग 512 मीटर तक बढ़ता है। जब मैं -Xmx1024m का उपयोग करता हूं, तो स्मृति उपयोग पूर्ण होने से पहले लगभग 1024 मीटर तक बढ़ता है जब यह केवल 512 मीटर का उपयोग कर सकता था। – Raihan

+0

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

+0

@Raihan यदि आपको JVM के साथ रहना है, तो सभी मामलों में आपको चलाने के लिए अधिकतम मेमोरी मिलनी चाहिए। फिर System.gc() के साथ सिस्टम को जीसी के लिए सुझाव दें। अपने -Xmx1024m मामले में, System.gc() का आह्वान करें और फिर देखें कि आपका उपयोग अधिक है या नहीं। सही मेमोरी मानों को पढ़ने के लिए भी ध्यान रखें। सिर्फ इसलिए कि जेवीएम ने सभी मेमोरी को हटा दिया है इसका मतलब यह नहीं है कि ओएस अभी तक सभी मेमोरी को प्रक्रिया से दूर ले जाने को तैयार है। –

1

-एमएमएक्स 1024 मीटर से वीएम पास करके आप मूल रूप से वीएम को बताते हैं कि यह 1 गीगा ढेर तक का उपयोग कर सकता है, जो अंततः यह करेगा। जब आवश्यक हो, तो वीएम कचरा संग्रह चलाने के लिए शुरू होता है, उदाहरण के लिए। जब ढेर का उपयोग किया जाता है, जो उपलब्ध ढेर आकार पर निर्भर करता है। यदि आप जानते हैं कि कौन सा कार्य बाहर चलाना है (जो मुझे लगता है कि आप ऐसा करते हैं क्योंकि आप इसे cmd लाइन पैरामीटर के रूप में पास करते हैं), तो एक्सएक्सएक्स को बाहर से क्यों सेट न करें?

+0

क्या कचरा कलेक्टर का सुझाव देने का कोई तरीका नहीं है जब तक कि सभी एक्सएक्सएक्स की ढेर राशि शुरू होने से पहले उपयोग न हो जाए, जब भी कुछ 'एक्स' राशि नई मेमोरी आवंटित की जाती है, तब से शुरू करने के बजाय? – Raihan

+0

झंडे का एक पूरा समूह है जिसके साथ आप खेल सकते हैं: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html मुझे उन लोगों में से कुछ के प्रभाव के बारे में भी यकीन नहीं है झंडे हालांकि है। – jayeff

1

मेमोरी खपत देखने के लिए http://visualvm.java.net/ का उपयोग करने का प्रयास करें। फिर आप लीक की पहचान के लिए ढेर सामग्री और http://www.eclipse.org/mat/ को देखने के लिए जाट का उपयोग कर सकते हैं।

8

इन दो मापदंडों जब वह अपने ढेर के आकार को समायोजित करने की जरूरत है JVM सुझाव देते हैं:

-XX:MaxHeapFreeRatio=10 
-XX:MinHeapFreeRatio=10 

जो काफी मतलब है कि अगर जी सी के बाद, ढेर के 10% से अधिक नि: शुल्क है, इसे देने की कोशिश करेंगे ओएस को वापस स्मृति। और यह केवल ढेर बढ़ेगा यदि जीसी के बाद 90% से अधिक ढेर का उपयोग किया जाता है।

इससे आपके प्रोग्राम को धीमा कर दिया जा सकता है, क्योंकि जीसी आवंटित स्मृति आकार को लगातार बदल देगा। और यह संभव है कि यदि आपका प्रोग्राम कम समय में बड़ी मात्रा में स्मृति आवंटित करता है तो इसका कोई प्रभाव नहीं पड़ेगा।

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