2014-10-09 6 views
6

मैं VisualVM का उपयोग कर अपने जावा एप्लिकेशन (JDK 1.7 में लिखा गया) की निगरानी कर रहा हूं। निम्नलिखित ग्राफ है जो इस एप्लिकेशन के दौरान चलने वाली अवधि के लिए हीप मेमोरी उपयोग दिखाता है।विजुअलVM: आदर्श हीप मेमोरी उपयोग ग्राफ

enter image description here

इस ग्राफ को देखते हुए लोगों को यह में spikes के एक बहुत देखते हैं कि देखते हैं। ये स्पाइक्स आवेदन द्वारा वस्तुओं के निर्माण का संकेत देते हैं। एक बार जब एप्लिकेशन उनके साथ किया जाता है तो यह उन्हें जीसी (जिसे इस मामले में निहित रूप से बुलाया जाता है) का उपयोग करके नष्ट कर देता है।

इसके अलावा, यहां स्मृति प्रोफाइलर का एक स्क्रीनशॉट जब आवेदन अभी भी

enter image description here

चल रहा है मेरे लिए ऊपर और नीचे ग्राफ की प्रकृति जावा वस्तुओं के कुशल उपयोग इंगित करता है। क्या यह अनुमान सही है?

ढेर उपयोग ग्राफ की आदर्श प्रकृति क्या है जिसका लक्ष्य रखना चाहिए?

क्या कोई अन्य तरीका है कि मैं अपने आवेदन द्वारा ढेर स्मृति उपयोग में सुधार कर सकता हूं?

+2

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

+0

आपकी मेमोरी उपयोग पूरी तरह से ठीक दिखती है –

+0

@VictorSorokin JVM जीसी बहुत कम अल्पकालिक वस्तुओं को बहुत अच्छी तरह से संभालती है। यह कोई मुद्दा नहीं है। – pickypg

उत्तर

3

मेरे लिए ग्राफ की ऊपर और नीचे प्रकृति जावा वस्तुओं के कुशल उपयोग को इंगित करती है। क्या यह अनुमान सही है?

मैं कचरा कलेक्टर का कुशल उपयोग कहूंगा। मैं सुझाव दूंगा कि कम वस्तु बनाना अधिक कुशल हो सकता है।

ढेर उपयोग ग्राफ की आदर्श प्रकृति क्या है जिसका लक्ष्य रखना चाहिए?

यह आपके आवेदन पर निर्भर करता है। मैं एक ऐसे लक्ष्य का लक्ष्य रखता हूं जो लगभग पूरी तरह से फ्लैट है।

क्या कोई अन्य तरीका है कि मैं अपने आवेदन द्वारा ढेर स्मृति उपयोग में सुधार कर सकता हूं?

भार

  • कम कचरा पैदा करते हैं। कचरा बनाया जा रहा है यह जानने के लिए अपने मेमोरी प्रोफाइलर का प्रयोग करें।
  • ढेर को बड़ा बनाते हैं, इसलिए यह अक्सर जीसी नहीं होता है।
  • ढेर बंद अपने को बनाए रखा डेटा को स्थानांतरित
  • (यदि आप एक बहुत कुछ है प्रतीत नहीं होते हैं)

आपके मामले में, सबसे अच्छा विकल्प कचरा की मात्रा का उत्पादन कर रहे कम करने के लिए किया जाएगा।

+0

के स्क्रीन शॉट के साथ प्रश्न अपडेट किया है, जब मैं उन्हें आवश्यकता होती हूं तो मैं वास्तव में उसी जावा प्रकार की वस्तुओं को पुनर्जीवित कर रहा हूं। क्या यह आवश्यक वस्तुओं का पुन: उपयोग करने में मदद करेगा, लेकिन जब आवश्यक नहीं हो तो उन्हें अन-प्रारंभ करें (फिर सेट करें)। इस मामले में जेवीएम उन्हें कूड़ेदान के रूप में चिह्नित नहीं करेगा। इसलिए जीसी कम बार आवंटित किया जाएगा। – davison

+0

@ डेविडन यदि आप अधिकांश ऑब्जेक्ट्स रीसायकल करते हैं तो यह मदद कर सकता है। यदि आप केवल एक शीर्ष स्तर की वस्तु को रीसायकल करते हैं तो इससे मदद नहीं मिल सकती है। यदि आपने योरकिट जैसे व्यावसायिक प्रोफाइलर का उपयोग नहीं किया है तो आप पाएंगे कि पहले 10 अनुकूलित करने के लिए बेहतर चीजें हैं। आप YourKit और अन्य प्रोफाइलरों के लिए एक eval लाइसेंस प्राप्त कर सकते हैं। अगर मैं माप नहीं पा रहा हूं, तो मैं अनुमान लगा रहा हूं। –

+1

@ डेविसन आप इंडेक्स किए गए लूप का उपयोग करके इन इटरेटर्स को खत्म कर सकते हैं। –

1

जब तक ढेर का आकार लगभग समय के साथ ही रहता है, तो आप ठीक हैं। सन जेवीएम में विश्व जीसी को रोकने की प्रकृति के कारण प्रयुक्त ढेर ऊपर और नीचे जाना चाहिए। ऐसा लगता है कि आपके ऐप में बहुत सी छोटी जीवित वस्तुएं उत्पन्न होती हैं, यह अक्षम हो सकती है, लेकिन कभी-कभी आपको उन्हें बनाने की आवश्यकता होती है। यह जावा की जीवनशैली है: डी

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