2010-01-08 27 views
10

मुझे वर्तमान में समस्या है कि मेरे पास एक (आंशिक) प्रोग्राम है जो कक्षा को लोड करने का प्रयास कर रहा है लेकिन विफल रहता है क्योंकि यह इस वर्ग को नहीं ढूंढ सकता है। स्टैक ट्रेस को देखते हुए, मुझे के लिए कोई विशेष कारण नहीं दिख रहा है क्यों वीएम इस विशेष श्रेणी को पहली जगह लोड करने का प्रयास करता है। क्या कोई उपकरण है जो मुझे यह समझने देगा कि एक विशेष वर्ग क्यों लोड किया जा रहा है?जावा: पता लगाना * क्यों * एक वर्ग लोड किया गया है

संकेत: मुझे पहले से ही सटीक बिंदु पर एक स्टैक ट्रेस मिल रहा है जहां JVM कक्षा को लोड करने का प्रयास करता है (एजेंट के माध्यम से)। हालांकि, स्टैक ट्रेस में कोई लाइन नंबर नहीं है। इसलिए मुझे केवल यह पता है कि कौन सी विधि कक्षा को लोड किया जा रहा है, न कि कौन सा कथन। फिर, कथन को जानने के लिए भी पर्याप्त नहीं हो सकता है। एक कथन कई वर्गों में कक्षा को लोड करने का कारण बन सकता है, क्योंकि कभी-कभी वीएम को कक्षाओं के पारगमन बंद करने का हिस्सा लोड करने की आवश्यकता होती है।

+1

मैं जावा से परिचित नहीं हूं, लेकिन इस वर्ग का एक नकली प्रदान करने के बारे में और इसमें कॉल स्टैक को देखते हैं? यदि जावा में यह संभव है, वैसे भी। – balpha

+3

शायद आप यहां स्टैक ट्रेस पोस्ट कर सकते हैं क्योंकि कोई इसका उपयोग करने में मदद कर सकता है। –

+0

यह सत्यापनकर्ता का दुष्प्रभाव हो सकता है (जावा पज़लर देखें)। लेकिन अधिक जानकारी की जरूरत है। –

उत्तर

19

-XX:+TraceClassLoading और -XX:+TraceClassResolution झंडे के साथ अपना प्रोग्राम चलाएं।

[Loaded com.kdgregory.example.memory.PermgenExhaustion$MyClassLoader from file:/home/kgregory/Workspace/Website/programming/examples/bin/] 
RESOLVE com.kdgregory.example.memory.PermgenExhaustion$MyClassLoader java.net.URLClassLoader 
RESOLVE java.net.URLClassLoader java.lang.Class URLClassLoader.java:188 

आप एक विशेष वर्ग के लिए संकल्प संदेशों के श्रृंखला का पता लगाने की आवश्यकता होगी: यह उत्पादन का एक बहुत है कि निम्नलिखित की तरह दिखता है पैदा करेगा। या अधिक संभावना है, जब आपका प्रोग्राम वर्ग लोड करने का प्रयास करता है, तो उस वर्ग को हल करने वाले वर्ग के संदेशों को हल करने से पहले आपको एक त्रुटि दिखाई देगी)।

+0

यह उपयोगी लग रहा है। धन्यवाद, मैं इसे देख लूंगा, धन्यवाद! – user66237

+0

बस मुझे जो चाहिए वह बन गया! मेरा दिन बनाया! बहुत बहुत धन्यवाद! – user66237

+0

बिल्कुल मैं क्या इसके लिए भी जरूरी है। लेकिन अपने जैसे अस्वस्थ लोगों को ध्यान दें: यदि आप अंधेरे से तर्कों का चयन और प्रतिलिपि बनाते हैं "-XX: + TraceClassLoading और -XX: + TraceClassResolution, सुनिश्चित करें कि आप इसका उपयोग करते समय" और "के बीच प्रतिलिपि नहीं बनाते हैं। मुझे विश्वास नहीं है कि पायलट त्रुटि को समझने में मुझे कितना समय लगेगा। –

5

आप जेडपेन्ड जैसे स्थिर विश्लेषण टूल को देख सकते हैं कि कक्षाओं के वर्गों के संदर्भ में कौन से वर्ग हैं।

+1

मैंने पहले ही ऐसा किया है लेकिन निर्भरता बहुत सूक्ष्म हैं। जिस वर्ग को लोड किया जाता है उसमें उस विधि में उल्लेख नहीं किया गया है जो वर्तमान में कक्षा लोड होने पर निष्पादित हो रहा है। यह वर्तमान विधि में किसी प्रकार के रिसीवर वर्ग के एक सुपर क्लास के एक फील्ड प्रकार के सुपर क्लास की तरह कुछ होना चाहिए ... आपको मेरा मतलब है। – user66237

0

Classloaders

यदि यह एक envorinment जहां कई वर्ग लोडर खेल (एक वेब अनुप्रयोग की तरह) में हैं आपको सावधान रहना चाहिए। कृपया हमें बताएं कि ऐप क्या है।

संसाधन

हमें बताएं जहां जार (फ़ाइल/निर्देशिका संरचना) और क्या वर्ग लोड कर रहा है कर रहे हैं। क्या आप कक्षा.forनाम का उपयोग करके इसे डायनामिक रूप से लोड कर रहे हैं? या वसंत या आईओसी के एक और ढांचे का उपयोग कर? क्या यह मुख्य वर्ग है?

कुछ पिछले परीक्षण (हमारी मदद करने के लिए)

शायद तुम मुख्य विधि के भीतर से कुछ Class.getResource() का उपयोग कर बातें परीक्षण कर सकते हैं। यदि आप वर्ग foo.bar.Clazz क्लास.getResource ("/ foo/bar/Clazz.class") को देखने के लिए प्रयास करते हैं, तो यह देखने के लिए कि क्या यह कुछ मान्य है या नहीं। उस वर्ग के साथ ऐसा करने का प्रयास करें जो आपकी असफल कक्षा को लोड करता है यह देखने के लिए कि यह कहां है जहां आप उम्मीद करते हैं।

+0

मुझे पहले से ही सटीक बिंदु पर एक स्टैक ट्रेस मिल रहा है जहां JVM कक्षा को लोड करने का प्रयास करता है (एजेंट के माध्यम से)। हालांकि, स्टैक ट्रेस में कोई लाइन नंबर नहीं है। इसलिए मुझे केवल यह पता है कि कौन सी विधि कक्षा को लोड किया जा रहा है, न कि कौन सा कथन। – user66237

+0

मेरा इरादा यह देखना था कि समस्याग्रस्त वर्ग लोड को उत्तेजित करने वाला वर्ग अपेक्षित वर्ग लोडर (चलो जार कहें) या किसी अन्य पर था।बेशक, यदि आपके पास एकाधिक वर्ग लोडर हैं ... :( – helios

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