2010-11-19 10 views
6

क्या यह जांचने का कोई तरीका है कि कचरा कलेक्टर द्वारा ऑब्जेक्ट प्राप्त किया जा सकता है या नहीं?जांचें कि ऑब्जेक्ट कचरा कलेक्टर द्वारा प्राप्त किया जा सकता है

कहीं मेरे कोड में मैंने किसी चीज़ के लिए एक संदर्भ मिल गया है:

MyObject mo = myObject; 

फिर, ग्रहण डिबगर के माध्यम से, मैं वस्तुओं स्मृति स्थान मिलता है।

mo = null; 

वहाँ अगर पहले से संदर्भित वस्तु अब कचरा संग्रहण के लिए उपयुक्त है या वहाँ यह करने के लिए कहीं न कहीं एक और संदर्भ है कि अगर जाँच करने के लिए कोई तरीका है: बाद में, मैं संदर्भ अशक्त सेट?

धन्यवाद एक बहुत,

स्टीफन

उत्तर

13

आप रनटाइम पर मनमाने ढंग से ऑब्जेक्ट के साथ ऐसा नहीं कर सकते हैं, और वास्तव में यह निर्धारित करने के लिए पूरी तरह से संभव नहीं है। हालांकि, वहाँ दो विकल्प है कि अपनी आवश्यकताओं पर निर्भर करता है उपयुक्त हो सकता है कर रहे हैं: आप null के संदर्भ में सेट करने के बाद

  1. एक ढेर डंप ले लो, और उसके बाद इस तरह के jhat या एक प्रोफाइलर के रूप में एक ढेर विश्लेषक उपकरण में यह लोड कि इसका समर्थन करता है। इन उपकरणों को आपको जीसी जड़ों से पथ को पार करने देना चाहिए और इस प्रकार जांच करें कि क्या आपकी वस्तु अभी भी पहुंच योग्य है या नहीं।
  2. किसी दिए गए ReferenceQueue के साथ ऑब्जेक्ट को PhantomReference में लपेटें। जब संदर्भ संलग्न होता है, तो आप जानते हैं कि वस्तु कचरा एकत्रित किया गया है। (दुर्भाग्यवश, यदि संदर्भ अनिश्चित है तो यह हो सकता है क्योंकि ऑब्जेक्ट अभी भी पहुंच योग्य है, या ऐसा इसलिए हो सकता है क्योंकि जीसी ने अभी तक ऑब्जेक्ट का निरीक्षण नहीं किया है। सभी जीसी से संबंधित प्रश्नों के साथ, कचरा संग्रह एक निर्धारिक प्रक्रिया नहीं है!)

पूरे हालांकि पर, मैं मानता हूँ कि सबसे अच्छा विकल्प बारे में पता स्मृति रिसाव मुद्दों में से हो सकता है और आपके आवेदन उन्हें बचने के लिए डिजाइन करने के लिए है। यदि आपके पास मेमोरी रिसाव है तो यह पर्याप्त स्पष्ट होना चाहिए, और फिर आप अपनी ऊर्जा को समस्या को खोजने पर ध्यान केंद्रित कर सकते हैं (फिर डंपिंग और उन वस्तुओं के ढेर का विश्लेषण करके जो गलत तरीके से पहुंच योग्य हैं)।

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

+0

यह एक huuuuuuuuuuuuuge अनुप्रयोग है, जहां हमने स्मृति समस्याओं का अनुभव किया। एक अनुकूलन अब सुधार के लिए नेतृत्व करना चाहिए, लेकिन जितना हम उम्मीद करते हैं उतना नहीं। इसलिए हम जानना चाहते हैं कि विशिष्ट वस्तुएं कचरा एकत्र की जाती हैं या नहीं। आपके उत्तर के लिए धन्यवाद, मैं इसे आजमाउंगा! – swalkner

+0

सही आपको शुद्ध कचरा मिलेगा: डी – delive

1

नहीं। ऐसा करने के लिए केवल एक चीज के लिए सावधान रहना और ध्यान में रखना है जब आपके आवेदन लिख कि मेमोरी लीक जावा में मौजूद कर सकते हैं के लिए है।

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

+0

आपके उत्तर के लिए धन्यवाद! निश्चित रूप से सावधान रहना सबसे महत्वपूर्ण बात है, लेकिन कभी-कभी यह पर्याप्त या संभव नहीं है (एंड्रज़ी डोइल का जवाब देखें) – swalkner

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