2009-02-21 21 views
9
 
java version "1.5.0_14" 
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_14-b03) 
Java HotSpot(TM) Server VM (build 1.5.0_14-b03, mixed mode) 

मैं स्थिर रूप से परिभाषित क्षेत्र के संदर्भ को पारित करने के लिए एक NullPointerException को डीबग करने का प्रयास कर रहा हूं। अधिक विशिष्ट होने के लिए, मैं एक Drools3 काम कर रहे स्मृति उदाहरण पर एक वैश्विक स्थापित कर रहा हूँ।जावा क्लास कचरा संग्रह घटनाओं को कैसे प्रिंट करें?

workingMemory.setGlobal("log", workingMemorieslog); 

मेरे धारणा है कि कक्षा जहां क्षेत्र स्थिर परिभाषित किया गया है किया जा रहा कचरा एकत्र किया जाता है है। (प्राप्त करने वाला वर्ग वीक रेफरेंस या ऐसा कुछ उपयोग करना चाहिए, मुझे वास्तव में पता नहीं है)

आप इसे डीबग करने का सुझाव कैसे देंगे? मुझे लगता है कि अगर मुझे पता चल जाए कि JVM के जीसी कक्षा के वर्ग/उदाहरण को अनलोड करता है तो मैं छोटी गाड़ी व्यवहार के कारण को कम कर सकता हूं। (यदि घटना का सही समय कम से कम संकेत नहीं मिलता है कि कुछ हुआ है)।

धन्यवाद, मैक्सिम।

+0

अच्छा प्रश्न, अच्छा अनुवर्ती, अपने आप का अच्छा जवाब। प्रश्न और उत्तर दोनों के लिए +1। – VonC

उत्तर

10

जीसी गतिविधि का पता लगाने के लिए जावा आदेश से जोड़ें:

-verbose: जीसी -XX: + PrintGCTimeStamps -XX: + PrintGCDetails

एनपीई है कि आप हो रही है शायद आप है शून्य मूल्य गुजर रहा है।

+0

उत्तर देने के लिए धन्यवाद, मैं पहले से ही -XX: + PrintGCDetails -verbose: gc -Xnoclassgc के साथ चल रहा हूं और अभी भी मुझे कोई कक्षा लोडिंग/अनलोडिंग जानकारी दिखाई नहीं दे रही है। एकमात्र आउटपुट I से हैं: [जीसी [PSYoungGen: 4096K-> 630K (4736K)] 4096K-> 790K (48064K), 0.0032750 सेकंड] –

+0

चूंकि यह उत्तर प्रश्न के प्रारंभिक विषय के लिए सबसे अच्छा है मैं इसे उत्तर के रूप में स्वीकार कर रहा हूं। धन्यवाद। –

0

क्या आपके पास स्टैक ट्रेस है?

क्या आपने यह देखने के लिए 'सेटग्लोबल' विधि (मान लीजिए कि आपके पास कोड है) में कदम उठाने का प्रयास किया है?

2

कक्षा को स्मृति में क्यों न रखें, फिर भी देखें कि यह अभी भी होता है, अगर ऐसा होता है तो आपकी समस्या कहीं और है। यदि नहीं तो आप जानते हैं कि समस्या कचरा संग्रह में निहित है।

1

यह पता चला है कि यहां ग्रहण मुख्य मुद्दा है।

मैं समझाएंगे:

मैं आदेश प्रदर्शन का परीक्षण करने में एक मुख्य() विधि में हमारे webapp लपेटा है। हम बहुत से तृतीय पक्ष कोड का उपयोग करते हैं, अर्थात् अपाचे कॉमन्स-पूल।

यह पता चला है कि हमारे पास परियोजनाओं (ग्रहण परियोजनाओं) में फैले जार के कई संस्करण थे। मेरे प्रोजेक्ट का उपयोग करने वाले मेरे ऐप में कॉमन्स-पूल-1.3 था, एक अलग परियोजना में कॉमन्स-पूल-1.2 था।

जब सर्वलेट कंटेनर (tomcat6) webapp वर्ग लोडर पहली प्राथमिकता थी, इसलिए यह हमेशा webapp संस्करण लोड का उपयोग कर लोड। जब मैंने मुख्य() ग्रहण का उपयोग करके आवेदन शुरू किया, तो यह बहुत ही बुद्धिमान व्यवहार नहीं है, वर्तमान परियोजना में मौजूद लोगों से पहले-पासस्पाथ में निर्भर परियोजनाओं के जारों को निर्यात किया गया है।

संघर्ष था जिसमें एक गैर परिभाषित व्यवहार की वजह से आम-पूल, के 2 संस्करणों के बीच था - एक वस्तु उधार पर कभी कभी एक नई वस्तु बनाने का फैसला किया है। मैंने कार्यान्वयन कोड के अंदर नहीं देखा है, मुझे लगता है कि यह जेनेरिककिएडऑब्जेक्टपूल (समस्याग्रस्त वर्ग) द्वारा स्थिर मानचित्र पकड़ के साथ कुछ करना है। क्योंकि एक नया उदाहरण बनाया गया था, वास्तव में उल्लेखनीय वैश्विक के लिए एक शून्य संदर्भ है।

मेरी किस्मत का समाधान अपेक्षाकृत आसान था, कॉमन्स-पूल का उपयोग केवल मेरे वेबैप द्वारा किया जा रहा है, इसलिए मैं इसे सभी संदर्भित परियोजनाओं से हटा सकता हूं, अन्यथा मुझे लगता है कि मैं उन्हें सभी को एक संस्करण में अपग्रेड करने का प्रयास करूंगा।अगर मैं नहीं कर सका तो मैं वास्तव में नहीं जानता कि मैंने क्या किया होगा। यह ग्रहण का एक बहुत ही अजीब डिफ़ॉल्ट है।

पढ़ने और मदद करने के लिए धन्यवाद।

// ps। 3 दिन। यही वह समय है जब मैंने यह समझने में व्यतीत किया है कि मैंने अपने सर्वलेट प्रतिस्थापन कोड में क्या गलत किया है। बाहर निकलता है मैं भी समस्या नहीं हूँ। : पी

+1

FYI करें: यदि आप अजीब वस्तु संदर्भ समस्या है, तो प्रवेश करने का प्रयास 'ProblemClass.class.getProtectionDomain() getCodeSource() getLocation() toExternalForm()' यह जार या वर्ग फ़ाइल है जहाँ से वर्ग भरा गया वापस आ जाएगी।।। । वेब अनुप्रयोगों को डीबग करते समय यह एक अमूल्य चाल है, जो अक्सर गैर-निर्धारिती क्लासलोडर समस्याओं से ग्रस्त होती है। – Ajax

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