2010-06-11 16 views
10

मेरे पास जावा एप्लिकेशन है जो उपयोग किए जाने पर बहुत सारी मेमोरी का उपयोग करता है, लेकिन जब प्रोग्राम का उपयोग नहीं किया जा रहा है, तो स्मृति उपयोग नीचे नहीं जाता है।ऐप का उपयोग होने पर जावा मेमोरी उपयोग बढ़ता है, लेकिन उपयोग नहीं होने पर घटता नहीं है

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

System.gc काम नहीं कर रहा है।

+2

System.gc केवल कचरा इकट्ठा करने का सुझाव देता है ... यह वास्तव में एक कचरा संग्रह नहीं है। – Ascalonian

+0

"फ्री-एम" जांचें, शायद उनमें से बहुत सारे कैश हैं, आपका ढेर ऊपर जा रहा है और जीसी के साथ सामान्य रूप से किया जाता है। – Steve

उत्तर

7

टिप्पणियों में बताया गया है, यह निश्चित नहीं है कि, कचरा कलेक्टर ऑब्जेक्ट्स का निपटारा करता है, यह सिस्टम को स्मृति देता है।

डिफ़ॉल्ट रूप से JVM बढ़ता है या प्रत्येक जीसी पर ढेर सिकुड़ता मुक्त अंतरिक्ष के अनुपात रखने के लिए एक निर्दिष्ट सीमा के भीतर प्रत्येक संग्रह में वस्तुओं रहने के लिए:

शायद Tuning Garbage Collection Outline आपकी समस्या का समाधान प्रदान करता है।

  • -XX:MinHeapFreeRatio - जब एक पीढ़ी में मुक्त स्थान का प्रतिशत इस मूल्य से नीचे गिर जाता पीढ़ी यह प्रतिशत पूरा करने के लिए विस्तार किया जाएगा। डिफ़ॉल्ट 40
  • -XX:MaxHeapFreeRatio - जब एक पीढ़ी में मुक्त स्थान का प्रतिशत इस मूल्य से अधिक हो गया तो पीढ़ी इस मूल्य को पूरा करने के लिए घट जाएगी। डिफ़ॉल्ट 70

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

enter image description here

+0

उत्कृष्ट बिंदु। मैंने ऐसा नहीं सोचा था। अद्यतन उत्तर – aioobe

0

System.gc यह किसी भी स्मृति जब भागा मुक्त करना चाहिए अगर के बारे में कोई गारंटी नहीं है। देखें Why is it bad practice to call System.gc()?

Xmx JVM आर्ग में सुधार करने का प्रयास करें नीचे यह एक बड़ा मान पर सेट है, तो और JConsole में एक बार देख ले देखने के लिए स्मृति के उपयोग और जीसी गतिविधि के साथ चल रहा है। आम तौर पर आप एक दांत दांत पैटर्न देखेंगे।

आप यह भी देखने के लिए एक प्रोफाइलर का उपयोग करना चाह सकते हैं कि स्मृति कहां उपयोग की जा रही है और किसी भी लीक की पहचान करने के लिए।

0

दो बातों में से एक हो रहा है:

1) आपका आवेदन संदर्भ लीक कर रहा है। क्या आप वाकई ऑब्जेक्ट्स पर फांसी नहीं कर रहे हैं जब आपको अब उनकी आवश्यकता नहीं होगी? यदि आप करते हैं, तो जावा उन्हें स्मृति में बनाए रखना चाहिए।

2) जावा का काम ठीक है। आपको स्मृति से कोई लाभ नहीं मिलता है जिसका आप उपयोग नहीं कर रहे हैं।

2

आपका क्या मतलब है? यदि यह रैम है (जावा वीएम के इस्तेमाल किए गए हीप स्पेस की मात्रा के विपरीत) तो यह सामान्य हो सकता है। यह स्मृति आवंटित करने के लिए अपेक्षाकृत महंगा ऑपरेशन है, इसलिए जब एक बार JVM को कुछ मिल जाए तो उसे वापस देने के लिए काफी अनिच्छुक होता है, भले ही उस समय इसकी आवश्यकता न हो।

1

क्या आपने मेमोरी प्रोफाइलर का उपयोग करने पर विचार किया है? यदि आपके पास एक तक पहुंच नहीं है, तो आप jmap -histo <pid> के समूह को पकड़ने और मतभेदों को समझने के लिए एक स्क्रिप्ट लिखने के साथ शुरू कर सकते हैं।

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

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