आप मानते हैं कि Class.getResourceAsStream()
हमेशा एक स्ट्रीम लौटाएगा जो आपकी कक्षा 'JAR फ़ाइल के अंदर एक फ़ाइल को इंगित करता है। यह गलत है। आपके क्लासपाथ में फ़ोल्डर भी हो सकते हैं, जिसमें Class.getResourceAsStream()
FileInputStream
लौटाएगा। कुछ अन्य क्लास लोडर अन्य प्रकार के संसाधन भी लौटा सकते हैं, जैसे रिमोट फाइलें (URLClassLoader के मामले में)।
यहां तक कि एक जेएआर फ़ाइल के मामले में, यह भी संभव है कि कार्यान्वयन, जेएआर फ़ाइल के अंदर एक सतत दृश्य को आपके द्वारा उपयोग की जा रही फ़ाइल के संकुचित बाइट्स पर बनाए रखें। हो सकता है कि यह ByteBuffer
मैप किए गए मेमोरी पर हो रहा है ...
मौका क्यों लें? आपको हमेशा स्ट्रीम (और कोई अन्य बंद करने योग्य, वास्तविक) बंद करना चाहिए, इससे कोई फर्क नहीं पड़ता कि उन्हें आपको कैसे दिया गया था।
लीक का पता लगाने के लिए, वीएम बंद होने के समय मेमोरी डंप प्राप्त करने की सबसे अच्छी रणनीति है, फिर इसे कुछ टूल के साथ विश्लेषण करें। दो लोकप्रिय उपकरण jhat और Eclipse mat हैं।