2009-07-14 7 views
22

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

मैंने Google, स्प्रिंग और हाइबरनेट फ़ोरम में खोजना शुरू कर दिया है, लेकिन इससे मदद नहीं मिलती है। इस त्रुटि के बारे में कई चर्चाएं हैं, लेकिन प्रत्येक समाधान के लिए, लोग हैं, जो कहते हैं: 'यह काम करता है' और अन्य लोग कहते हैं 'यह नहीं है'।

उदाहरण के लिए, कई लोग -XX:MaxPermSize JVM पैरामीटर बढ़ाने की पेशकश करते हैं, अन्य कहते हैं कि यह काम नहीं करता है। ऐसी पोस्टें हैं जो कहती हैं कि जावासिस्ट लाइब्रेरी और अन्य और cglib लाइब्रेरी के उपयोग में समस्या का उपयोग करने की आवश्यकता है। अन्य कहते हैं कि समस्या cglib में है।

हम Java1.5_0_09 का उपयोग करते हैं, जावास्वास्ट 3.4.जीए के साथ स्प्रिंग 2.5, टॉमकैट 5.5 वेब कंटेनर और ओरेकल 10 जी डेटाबेस के रूप में।

क्या कोई मुझे बता सकता है कि इस समस्या का कारण क्या है और इसे कैसे हल किया जाए?

+1

क्या आप बहुत सारे तारों को इंटर्न कर रहे हैं? आंतरिक तार पर्मगेन – bajafresh4life

उत्तर

19

-XX:MaxPermSize काम करता है, आपको अभी सही मूल्य प्राप्त करना है। डिफ़ॉल्ट, मेरा मानना ​​है कि क्लाइंट-मोड वीएम के लिए 32 एमबी है, और सर्वर मोड वीएम के लिए 64 एमबी है। मैं इसे 256MB करने के लिए स्थापित करने का सुझाव है, अगर आप स्मृति:

java -XX:MaxPermSize=256m 

समस्या होती है क्योंकि वसंत और हाइबरनेट क्रम-उत्पन्न कक्षाओं का भारी इस्तेमाल, कभी कभी उनमें से एक बहुत कुछ कर सकते हैं। ये जेनरेटेड क्लास सभी पर्मजेन मेमोरी पूल में जाते हैं, इसलिए यदि आप उन ढांचे का उपयोग करते हैं, तो आपको अक्सर अपने पर्मजेन को बड़ी मात्रा में बढ़ावा देने की आवश्यकता होती है।

+11

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

+0

अफसोस की बात है, हाँ। ऐसा लगता है कि हम इसके साथ काफी अटक गए हैं। – skaffman

+0

@ स्काफमैन, क्या इसका मतलब है कि स्प्रिंग और हाइबरनेट के शीर्ष पर बनाए गए किसी भी एप्लिकेशन को पर्मजेन पर ओओएम को रोकने के लिए पुनरारंभ करना होगा? मैं अपने सर्वर को हमेशा के लिए नया कोड धक्का देना चाहता हूं। –

3

जैसा कि स्काफमैन कहते हैं- -XX: MaxPermSize प्रॉपर्टी काम करती है, हालांकि कभी-कभी आपको एक अंतर्निहित समस्या हो सकती है जो सीमा को ऊपर उठाने से रोक सकती है।

क्या आपने this note देखा है? इससे मुझे एक बार एक ही समस्या का समाधान करने में मदद मिली। लिंक को संक्षेप में प्रस्तुत करने के लिए:

  • में आम/lib में डाल JDBC ड्राइवर (tomcat documentation का कहना है के रूप में) और नहीं वेब-INF/lib
  • नहीं वेब-INF/बिल्ला के बाद से lib में कॉमन्स-प्रवेश करने डाल करो पहले से ही इसे बूटस्ट्रिप्स
4

मैंने इस समस्या को हाइबरनेट (वसंत के बिना उपयोग किया) के साथ देखा है। मुद्दा यह था कि हम आवेदन के जीवनकाल के लिए एक उदाहरण बनाने के बजाय प्रत्येक उपयोगकर्ता अनुरोध के लिए SessionFactory का उदाहरण बना रहे थे।

मैंने इसकी जांच करने और समस्या की खोज के लिए YourKit profiler का उपयोग किया।

8

आपको अवगत होना चाहिए कि टोमकैट के कुछ संस्करणों में युद्ध पुनर्वितरण पर स्मृति रिसाव है। यह मेरे साथ tomcat 6.0.x पर हुआ।

के रूप में सुझाव दिया MaxPermSize बढ़ाने के लिए, यह अपने विकास मशीन के लिए एक अस्थायी समाधान है - और जब आप त्रुटि मिलती है, 2-3 दिनों के बाद, बस सर्वर को पुनरारंभ करें। उत्पादन पर इतना आसान नहीं है। तो यह विकास के लिए काम करता है, लेकिन यह दृष्टिकोण उत्पादन के लिए काम नहीं करता है, जहां आपको मेमोरी लीक के मुद्दों को ठीक करना चाहिए।

लीक खोजने के लिए jconsole जेडीके 1.6 और 1.5 के साथ आता है। आप एक प्रक्रिया से जुड़ सकते हैं, और समय के साथ इस्तेमाल स्मृति देख सकते हैं।

आप भी इन पढ़ सकते हैं:

2

दृश्य जीसी, अब जेडीके 6 का हिस्सा, वास्तविक समय में स्मृति का एक बहुत अच्छा ग्राफिकल प्रतिनिधित्व देता है। आप देख सकते हैं कि ईडन, पीरियनल और परम स्पेस के साथ क्या हो रहा है। आप बस क्यों नहीं देखेंगे।

अद्यतन: यह मेरे जेडीके 1.6.0_13 distro में bin/jvisualvm.exe है। इसे उस प्रक्रिया का पीआईडी ​​दें जिसे आप मॉनीटर करना चाहते हैं।

+1

यह दिलचस्प है। पर्मजेन पूल प्रसिद्ध रूप से अपारदर्शी है, और JVMTI डीबग इंटरफ़ेस के लिए दृश्यमान नहीं है। मुझे आश्चर्य है कि कैसे विडुअल जीसी में एक नजर आता है? – skaffman

0

यहां सभी प्रतिक्रियाएं वेब-ऐप के कई पुनरारंभ होने के कारण पर्मजेन समस्या से संबंधित हैं, लेकिन इस मामले में समस्या पहले से ही टॉमकैट पुनरारंभ करने के बाद पहले परिनियोजन पर होती है, इसलिए यह क्लासलोडर के संदर्भ या कॉमन्स की समस्या नहीं हो सकती है -logging।

+0

यह कोई उत्तर नहीं है, आपको मूल प्रश्न संपादित करना चाहिए और यह जानकारी जोड़ना चाहिए। –

0

यदि आप jdk6 पर चल रहे हैं तो आप एप्लिकेशन के मेमोरी उपयोग की निगरानी करने और आगे की जांच करने के लिए jconsole ऐप का उपयोग कर सकते हैं।

एक अन्य एवेन्यू पीछा करने के लिए एक प्रोफाइलर का उपयोग करना है, मैं जेपीरोफाइलर का उपयोग करता हूं, और उसके साथ आवेदन को देखता हूं। यह आपको बताएगा कि समस्या कहां से आ रही है।

0

मैं एक ही समस्या में भाग गया, और मेरे पास read that है टोमकैट इस स्थिति में अपराधी है।

फिर मैंने जेटी के लिए स्विच किया और सबकुछ बढ़िया हो गया, और ऐप अपेक्षित के रूप में तैनात/चलाता है। तो अगर टॉमकैट जरूरी नहीं है, तो मैं जेटी का सुझाव दूंगा।

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