2012-09-13 10 views
6

मुझे एक मजेदार समस्या है - यदि मेरा एप्लिकेशन लंबे समय तक चलता है (> 20h), तो कभी-कभी मुझे NoClassDefFound त्रुटि मिलती है - ऐसा लगता है कि जेवीएम ने फैसला किया है कि कक्षा नहीं होगी वैसे भी इस्तेमाल किया और जीसीडी इसे इस्तेमाल किया।यदि कक्षा लंबे समय तक चलती है तो कक्षाएं

में थोड़ा और अधिक विशिष्ट होना करने के लिए, यहां एक उदाहरण मामला है:

object ErrorHandler extends PartialFunction[Throwable,Unit] { 
    def isDefinedAt(t: Throwable) = true 
    def apply(e: Throwable) =e match { 
    // ... handle errors 
    } 
} 

// somewhere else in the code... 
try { 
    // ... long running code, can take more than 20 hours to complete 
} catch (ErrorHandler) 

और मैं निम्न अपवाद प्राप्त करें:

Exception in thread "main" java.lang.NoClassDefFoundError: org/rogach/avalanche/ErrorHandler$ 

अगर वह कोशिश/समय की कम मात्रा के लिए कैच ब्लॉक रन, सब कुछ अपेक्षित के रूप में काम करता है। Avalanche

मैं ध्यान दें कि मैं केवल Cent OS 5 मशीनों पर इस और इसी तरह की समस्याओं को देखा, JRE 6u26 और स्काला 2.9.1/2.9.2 का उपयोग कर की जरूरत है:

अगर कोई रुचि है, यहाँ सवाल में codebase है।

इस समस्या का कारण क्या हो सकता है?

+4

इसे '-XX: -TraceClassUnloading' के साथ चलाने का प्रयास करें। परिणाम क्या हैं? http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html – ron

+0

@ron - मैं अभी कोशिश कर रहा हूं, लेकिन इसमें कुछ समय लगेगा :) और लॉग फ़ाइल काफी लंबी है और वर्बोज़, किस शब्द के लिए मुझे ट्रेसिंग आउटपुट प्राप्त करने के लिए इसे grep करना चाहिए? – Rogach

+0

blindfolded अनुमान नहीं लगा सकता है, लेकिन संदिग्ध के तहत वर्ग का नाम एक निश्चित उम्मीदवार है :) – ron

उत्तर

1

यदि आप कक्षा शुरू करने की कोशिश कर रहे स्मृति से बाहर हो गए हैं, तो क्या आपको लगता है कि आप OutOfMemory या NoClassDef देखेंगे?

//from initialize_impl 
    if (NULL == message) { 
    // Out of memory: can't create detailed error message 
    THROW_MSG(vmSymbols::java_lang_NoClassDefFoundError(), className); 

यह अपने कोड OOM फेंक दिया हो सकता है, तो अपने अपवाद संचालक वस्तु लोड नहीं कर सका।

बेशक, अन्य संभावित क्षणिक स्थितियां हैं: नेटवर्क नीचे था और कक्षा नेटवर्क ड्राइव पर है; या आपने परीक्षण के दौरान अपनी कक्षा निर्देशिका को साफ़ किया है। एक और संभावना यह है कि आपने अपना ऐप केस-असंवेदनशील फ़ाइल सिस्टम पर बनाया है और एक केस-संवेदी फ़ाइल सिस्टम पर परीक्षण कर रहा है जिसमें एक असामान्य नामित क्लास फ़ाइल है। उदाहरण के लिए, यदि आप ऑब्जेक्ट "हैंडलर" को "हैंडलर" में * .class को हटाए बिना बदलते हैं, तो आप अभी भी "हैंडलर.क्लास" देखेंगे। (लेकिन मुझे संदेह है कि त्रुटि संदेश विवरण में नाम विवाद शामिल होगा, जब तक कि आप ओओएम नहीं हैं।)

मुझे AbstractFileClassLoader को तोड़ने का प्रयास करने का मौका नहीं मिला है; मेरी पिछली अटकलें निम्नानुसार हैं:

यह समझाए जाने योग्य है कि हिमस्खलन एक निर्माण उपकरण है, और आप scalac के सारफाइल क्लासलोडर के साथ लोड की गई मेमोरी क्लासफ़ाइल में build.scala को संकलित करने के लिए स्केलैक का एक उदाहरण चलाते हैं, जहां "सारफाइल" है अमूर्त चूंकि जो भी build.scala उपकरण कॉन्फ़िगरेशन के साथ mucks, स्पष्ट रूप से यह आवश्यक है कि एएफसीएल सम्मान क्लासलोडर प्रतिनिधिमंडल। यह सच लगता है, लेकिन मुझे लगता है कि यह getResourceAsStream (एक त्वरित परीक्षण की पुष्टि के रूप में) पर माता-पिता को पहले प्रतिनिधि नहीं देता है। संदिग्ध बात यह है कि findClass क्लासबाइट्स का उपयोग करता है, जो विफलता पर सुपर कॉल करता है, जो कि अच्छा ScalaClassLoader है, लेकिन Foo.class को लोड करने के लिए getResourceAsStream का उपयोग करता है। तो findClass को कॉल करने से माता-पिता सीएल (जो गलत है) से एक क्लास वापस कर सकता है, हालांकि माता-पिता को पहले से असफल होने के बारे में पता चल सकता है। क्योंकि यह मेरी रात का मध्य है, मैं निष्कर्ष निकाला नहीं जा सकता, लेकिन अगर मेरा निर्माण उपकरण इस व्यवहार पर निर्भर करता है तो मैं इसे कम करना चाहता हूं।

मुझे नहीं पता कि आपके build.scala (या av.scala) में क्या है जो एक दिन के लिए चलता है, लेकिन शायद आपको एक दुर्व्यवहार करने वाला बच्चा क्लासलोडर द्वारा लोड किया गया हिमस्खलन (पुनः) प्राप्त होता है, फिर जब यह फेंकता है, सीएल नहीं मिल सकता है आपकी त्रुटि क्लाउडलर।

+0

अच्छा, आप सही हो सकते हैं, लेकिन मैं दो अन्य स्थितियों में समान व्यवहार देखा, जहां मैंने क्लासलोडर्स के साथ गड़बड़ नहीं की थी। और उन सभी मामलों को एकजुट करने वाली थीम आंशिक कार्य प्रतीत होती है। – Rogach

+0

मुझे क्लासलोडर्स के बारे में कुछ भी नहीं पता है, लेकिन 'सारफाइल क्लासलोडर' का उपयोग किया जाता है (मुझे लगता है) केवल उस 'बिल्ड' वर्ग को लोड करने के लिए, और अन्य सभी वर्गों को डिफ़ॉल्ट क्लासलोडर से गुजरना चाहिए। या क्या कुछ तंत्र है, जिसके द्वारा बाल वर्गीकरणकर्ता अपने माता-पिता के प्रतिस्थापन शुरू कर सकता है? – Rogach

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