2013-01-10 14 views
17

मैं पहली बार नेटबीन में प्रोफाइलर की जांच कर रहा हूं, और मैंने आज सुबह देखा था कि मॉनीटर प्रोफाइलर के माध्यम से दिखाए गए 1700 से अधिक जीवित पीढ़ी थीं, लेकिन एक स्थिर ढेर आकार था। कुछ पढ़ने में मुझे this article मिला जो लीक को उजागर करने के लिए नेटबीन प्रोफाइलर का उपयोग करने पर चर्चा करता है।char [] इतनी पीढ़ी क्यों जीवित है, और मुझे चिंतित होना चाहिए?

तो, लेखों के सलाह के बाद मैंने एक मेमोरी प्रोफाइलर शुरू किया। परिणामों को देखते हुए मैंने पाया कि चार [] जीवित पीढ़ियों के लिए char [] खाते हैं। वर्तमान में इस पोस्ट के रूप में, char [] 22 पीढ़ियों और गिनती पर है।

अब कुछ posts (comment by OldCurmudgeon near the bottom) इंगित करते हैं कि यदि मेरा ढेर स्थिर है तो कोई रिसाव नहीं है, yet others कहता है कि यदि पीढ़ी बढ़ती रहती है तो वहां होता है। तो मैं थोड़ा उलझन में हूं जो सही है।

तो, मेरे सवाल यह है:

निम्नलिखित स्क्रीन शॉट्स के आधार पर मैं संभावित मेमोरी लीक आगे की जांच करना चाहिए?

Memory(Heap) मेमोरी (ढेर)

Memory(GC) मेमोरी (जीसी)

Live allocated objects लाइव आवंटित वस्तुओं

उत्तर

8

char[] शायद String वस्तुओं के द्वारा आयोजित किया जाएगा। उन्हें किसी भी उद्देश्य के लिए कहीं भी बनाया जा सकता है उदा। प्रोफाइलर और जेएमएक्स उन्हें एक ऐसी प्रक्रिया का उपयोग करते हैं जो कुछ भी नहीं दिखाता है (और एक बढ़ती ढेर)

नोट: क्लासलोडर को अनलोड किए जाने तक सभी स्ट्रिंग अक्षर और कक्षाओं के नाम आदि जीवित रहेंगे (यह जीवन का जीवन हो सकता है कार्यक्रम)

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

+0

दिलचस्प, क्या आपके पास प्रोफाइलिंग पढ़ने के लिए कोई अनुशंसित संसाधन है? –

+2

मैं नहीं कह सकता कि मैं किसी से भी आया हूं।मैं आपके वाणिज्यिक रूप से एक व्यावसायिक प्रोफाइलर का मूल्यांकन संस्करण प्राप्त करने की अनुशंसा करता हूं ताकि यह देखने के लिए कि यह किस अंतर में है। जैसे यह ढेर का उपयोग करने के लिए ढेर का उपयोग नहीं करता है, इसलिए यह ढेर पर "शोर" बनाता है। –

+2

मैं सरल प्रोग्रामों को प्रोफाइलिंग का सुझाव दूंगा जहां आप यह देखने के लिए कर रहे हैं कि यह सीपीयू और मेमोरी प्रोफाइलिंग के लिए कैसा दिखता है। इससे आपको यह समझने में मदद मिल सकती है कि कौन से जटिल अनुप्रयोग कर रहे हैं (और जानें कि क्या अनदेखा करना है, जो काफी हद तक;) –

2

मुझे अपने प्रोफाइलिंग के दौरान इन लिंगरिंग char [] का भी सामना करना पड़ा। एक लंबे विश्लेषण के बाद मैं एक निष्कर्ष पर आया कि इनमें से कई स्ट्रिंग निरंतर पूल के चार सरणी हैं।

2

कोड को देखे बिना, कोई नहीं बता सकता। ऐसे कार्यक्रम हैं जो स्मृति के टीबी का उपयोग करते हैं, और वे अच्छी तरह से काम करते हैं क्योंकि यह स्मृति रिसाव नहीं है, यह प्रोग्राम ही काम करता है।

Netbeans documentation सिर्फ जीवित पीढ़ियों परिभाषित करता है, स्मृति आंकड़े को स्थानांतरित करने के लिए उस आंकड़े का उपयोग कैसे करें। इसके अलावा, char[] सिर्फ String की सामग्री है, और इसे बहुत लंबे समय तक बरकरार रखा जा सकता है (यहां तक ​​कि जब तक मुख्य धागा)।

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

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

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