2013-10-25 13 views
19

मैं सोच रहा था कि जब मैं इस विधि का उपयोग करता हूं, तब से यह आवश्यक है, फ़ाइल क्लासपाथ से पढ़ी जा रही है। क्या "बंद नहीं होता" यह एक स्मृति रिसाव का कारण बनता है।क्लास.getResourceAsStream बंद होना चाहिए?

मैं इस तरह के मेमोरी लीक के लिए कैसे परीक्षण कर सकता हूं?

उत्तर

15

आप मानते हैं कि Class.getResourceAsStream() हमेशा एक स्ट्रीम लौटाएगा जो आपकी कक्षा 'JAR फ़ाइल के अंदर एक फ़ाइल को इंगित करता है। यह गलत है। आपके क्लासपाथ में फ़ोल्डर भी हो सकते हैं, जिसमें Class.getResourceAsStream()FileInputStream लौटाएगा। कुछ अन्य क्लास लोडर अन्य प्रकार के संसाधन भी लौटा सकते हैं, जैसे रिमोट फाइलें (URLClassLoader के मामले में)।

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

मौका क्यों लें? आपको हमेशा स्ट्रीम (और कोई अन्य बंद करने योग्य, वास्तविक) बंद करना चाहिए, इससे कोई फर्क नहीं पड़ता कि उन्हें आपको कैसे दिया गया था।

लीक का पता लगाने के लिए, वीएम बंद होने के समय मेमोरी डंप प्राप्त करने की सबसे अच्छी रणनीति है, फिर इसे कुछ टूल के साथ विश्लेषण करें। दो लोकप्रिय उपकरण jhat और Eclipse mat हैं।

4

लौटाया गया प्रकार एक इनपुटस्ट्रीम है, भले ही ठोस कार्यान्वयन (जो संस्करण से संस्करण में बदल सकता है), आपके पास एक करीबी() विधि है जिसे इमो को बुलाया जाना चाहिए।

कोई फर्क नहीं पड़ता कि यह विधि वास्तव में वर्तमान संस्करण के साथ कुछ उपयोगी कर रही है या नहीं।

5

अंगूठे के नियम के रूप में आपको सभी धाराएं बंद करनी चाहिए (और अन्य प्रकार जो करीबी कार्यक्षमता प्रदान करते हैं)। यह ro संसाधन लीक का नेतृत्व कर सकता है (स्मृति संसाधन का एक प्रकार है)।

हालांकि स्वचालित कचरा संग्रह है जो अंततः स्मृति को पुनः प्राप्त करता है जब किसी ऑब्जेक्ट को अब संदर्भित नहीं किया जाता है, फिर भी यह मूल संसाधनों को पकड़ सकता है जो जारी नहीं हो सकते हैं। इसके अलावा, अगर कुछ अन्य दीर्घकालिक वस्तु (जैसे क्लासलोडर) संसाधन पर रोक रखती है, तो कचरा कलेक्टर द्वारा इसका दावा नहीं किया जाएगा।

यदि आपका प्रोग्राम छोटा रहता है, या आप केवल कुछ ही संसाधनों को खोलते हैं, तो आप समस्याओं में भाग नहीं सकते हैं, लेकिन लंबे समय से चल रहे अनुप्रयोगों में संसाधन लीक का पता लगाना मुश्किल है।

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