2011-12-02 16 views
51

मैंने अपने कार्यक्रम पर एक ढेर डंप चलाया। जब मैंने इसे मेमोरी विश्लेषक टूल में खोला, तो मैंने पाया कि org.logicalcobwebs.proxool.ProxyStatement के लिए बहुत सारी मेमोरी ले रही थी। ऐसा क्यों है?स्मृति रिसाव है? java.lang.ref.Finalizer इतनी मेमोरी खाती है

screenshot

+0

"छवियां" लिंक आपके ट्विटर प्रोफाइल के रूप में दिखाई देता है। –

+0

@ आर। मार्टिनिन्हो फर्नांडीस यह एक छवि के माध्यम से जाता है जिसे उसने ट्विटर के साथ होस्ट किया है, मुझे लगता है। – Oliver

उत्तर

49

कुछ वर्गों Object.finalize() विधि को लागू। ऑब्जेक्ट्स जो इस विधि को ओवरराइड करते हैं उन्हें पृष्ठभूमि थ्रेड कॉल फ़ाइनलाइज़र द्वारा कॉल करने की आवश्यकता होती है, और जब तक ऐसा नहीं होता तब तक उन्हें साफ़ नहीं किया जा सकता है। यदि ये कार्य कम हैं और आप इनमें से कई को त्याग नहीं देते हैं तो यह सब ठीक काम करता है। हालांकि यदि आप इन वस्तुओं में से बहुत सारे बना रहे हैं और/या उनके फाइनलरों में काफी समय लगता है, तो ऑब्जेक्ट्स की कतार को अंतिम रूप दिया जाना चाहिए। इस कतार के लिए सभी मेमोरी का उपयोग करना संभव है।

समाधान है

  • को अंतिम रूप देने() घ वस्तुओं का उपयोग नहीं करते, तो आप (यदि आप वर्ग वस्तु के लिए लिख रहे हैं) कर सकते हैं
  • बहुत ही कम को अंतिम रूप देने बनाना (आप इसे उपयोग करने के लिए है, तो)
  • इस तरह की वस्तुओं हर बार त्यागने नहीं है (करने के लिए उन्हें फिर से उपयोग)

अंतिम विकल्प के रूप में आप एक मौजूदा पुस्तकालय का उपयोग कर रहे आपके लिए सबसे अच्छा होने की संभावना है की कोशिश करो।

+12

विकल्प # 4 - पुस्तकालयों का उपयोग करने से बचें जो (ओवर-) फ़ाइनलाइज़र का उपयोग करते हैं। –

+3

विकल्प # 1 की एक भिन्नता;) –

+0

शायद समस्या फ़ाइनलाइज़र थ्रेड का कारण है। एक वर्ग फाइनल मेथॉन्ड को ओवरराइड करता है, फ़ाइनलाइज़र थ्रेड मृत लॉक – fuyou001

7

जो मैं कर सकता हूं उससे, प्रॉक्सूल जेडीबीसी कनेक्शन के लिए एक कनेक्शन पूल है। इससे मुझे पता चलता है कि समस्या यह है कि आपका आवेदन कनेक्शन पूल का दुरुपयोग कर रहा है। कथन ऑब्जेक्ट्स पर close पर कॉल करने के बजाय, आपका कोड शायद उन्हें और/या उनके मूल कनेक्शन छोड़ रहा है। प्रॉक्सूल अंतर्निहित ड्राइवर-लागू वस्तुओं को बंद करने के लिए अंतिम रूपकों पर निर्भर है ... लेकिन इसके लिए उन अंतिम उदाहरणों की आवश्यकता है। इसका मतलब यह भी हो सकता है कि आप आवश्यकतानुसार कनेक्शन को खोलने/बंद करने (वास्तविक) डेटाबेस कनेक्शन को अधिक बार उत्पन्न कर रहे हैं, और यह प्रदर्शन के लिए खराब होगा।

तो मेरा सुझाव है कि आप रिजल्टसेट, स्टेटमेंट और/या कनेक्शन ऑब्जेक्ट्स के लिए अपना कोड जांचें, और सुनिश्चित करें कि आप उन्हें finally ब्लॉक में बंद कर दें।


मेमोरी डंप को देखते हुए, मुझे उम्मीद है कि आप चिंतित हैं कि 898,527,228 बाइट जा रहे हैं। विशाल बहुमत को अंतिमकर्ता ऑब्जेक्ट द्वारा बनाए रखा जाता है जिसका आईडी 2aab07855e38 है। यदि आपके पास अभी भी डंप फ़ाइल है, तो पर एक नज़र डालें किFinalizer का जिक्र है। यह Proxool वस्तुओं की तुलना में अधिक समस्याग्रस्त दिखता है।

+0

धन्यवाद लेकिन मुझे जेडीबीसी कनेक्शन पोल मेमो लीक – fuyou001

+0

का कारण नहीं मिल रहा है ठीक है, मैं तब तक नहीं कर सकता जब तक कि मैं आपका स्रोत कोड नहीं देखता। (और मैं वैसे भी अपने समय के माध्यम से घूमने के लिए तैयार नहीं हूँ ...) –

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