2012-06-07 18 views
7

मुझे टॉमकैट 5.5 और टॉमकैट 6.0 सर्वर के साथ यह अजीब समस्या है। मेरे पास दो वेब एप्लिकेशन हैं जो टोमकैट पर स्थापित किए जाएंगे। जब टोमकैट शुरू होता है तो इन दो वेब अनुप्रयोगों को भी एक साथ शुरू किया जाता है लेकिन कभी-कभी एक वेब एप्लिकेशन प्रारंभ करने में विफल रहता है क्योंकि एक एप्लिकेशन में इनिट विफलता के कारण किसी अन्य एप्लिकेशन को चलते समय classnotfoundexception त्रुटियां मिल रही हैं। टॉमकैट 7.0 में एप्लिकेशन ठीक चल रहा है भले ही अन्य एप्लिकेशन प्रारंभ करने में विफल रहा हो।टॉमकैट 5.5 में क्लास नॉटफाउंड अपवाद त्रुटि और टॉमकैट 6.0

कुछ डिबगिंग के बाद मुझे पता चला कि क्रिस्टल.जर नामक एक जार है जो दोनों अनुप्रयोगों के वेब-इंफ/lib फ़ोल्डर में है। मैंने जार को टॉमकैट के सामान्य/lib फ़ोल्डर में स्थानांतरित कर दिया है, फिर उसने ठीक काम करना शुरू कर दिया। मैं जानना चाहता हूं कि यह टॉमकैट 7.0 में क्यों ठीक काम नहीं कर रहा है, टॉमकैट 5.x और टॉमकैट 6.x संस्करणों में नहीं। क्या इन संस्करणों के बीच क्लासलोडिंग आर्किटेक्चर में कोई बदलाव है?

धन्यवाद

EDIT1: पुस्तकालय दोनों अनुप्रयोगों वेब-INF \ lib निर्देशिका के स्थान में था और वे बाहरी DLLS के साथ कोई निर्भरता है। अभी मैं टॉमकैट 5.5 क्लासलोडर आर्किटेक्चर के बारे में पढ़ता हूं और यह पता चला कि हर वेब एप्लिकेशन का अपना वर्ग लोडर है। WEB-INF \ lib फ़ोल्डर और कक्षा फ़ोल्डर में लाइब्रेरी इस क्लासलोडर में लोड हो जाएंगी। सामान्य निर्देशिका के तहत जो भी पुस्तकालय संग्रहित किया जाता है उसे साझा क्लासलोडर में रखा जाएगा। फिर इस पुस्तकालय को वेब अनुप्रयोग के अलग-अलग वर्ग लोडर में अलग से लोड किया जाना चाहिए। यहां तक ​​कि यदि कोई वेब एप्लिकेशन अन्य वेब एप्लिकेशन शुरू करने में विफल रहता है तो भी स्वतंत्र रूप से काम करना चाहिए। यही कारण है कि मैं अजीब महसूस किया और furthur की जांच करने की जरूरत है।

उत्तर

6

अंत में, इस समस्या को

मौजूद PermGen मेमोरी लीक का एक ज्ञात प्रकार के लिए इस सवाल का जवाब मिल गया जब एक पुस्तकालय वर्ग एक प्रणाली वर्ग द्वारा संदर्भित है और इस तरह अपनी उम्र के बाद रहता है। एक उदाहरण तब होता है जब जावा एक जेडीबीसी चालक, या कुछ अन्य सेवा और "स्वचालित रूप से पंजीकृत" होता है। यह सिस्टम में इसका संदर्भ रखता है, लेकिन कक्षा स्वयं वेब एप्लिकेशन से संबंधित है और को एप्लिकेशन बंद होने पर अनलोड किया जाना चाहिए - लेकिन संदर्भ के कारण नहीं। ऐसे सभी संदर्भ स्पष्ट नहीं हैं।

तरह के एक मामले में एक ठेठ लक्षण है कि पहले वेब अनुप्रयोग कि इस प्रणाली सुविधा पर निर्भर करता सफल होगा, लेकिन दूसरे और अन्य लोगों को असफल हो जायेगी (क्योंकि सेवा है कि प्रणाली में पंजीकृत है पहले का है वेब एप्लिकेशन और दूसरे एप्लिकेशन के क्लासलोडर से कक्षाएं नहीं देख सकते हैं और इसके विपरीत)।

टॉमकैट 7 और टॉमकैट 6 के हाल के संस्करणों में उनके डिफ़ॉल्ट कॉन्फ़िगरेशन में कुछ ज्ञात पर्मजेन मेमोरी लीक के विरुद्ध बेहतर सुरक्षा है।

टॉमकैट 5.5 में ऐसी सुरक्षा नहीं है।

संपादित कुछ संदर्भों

http://people.apache.org/~markt/presentations/2010-08-05-Memory-Leaks-JavaOne-60mins.pdf http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf

http://eclipse.org/mat/

http://wiki.apache.org/tomcat/FAQ/Troubleshooting_and_Diagnostics http://wiki.apache.org/tomcat/MemoryLeakProtection

+0

तो आप बस में वृद्धि हुई है MaxPermSize, है ना? –