2010-08-19 8 views
21

ऐसा लगता है कि बिलाव और

MemoryError: PermGen space 
java.lang.OutOfMemoryError: PermGen space 

की तरह एक आम समस्या है redeploys। आप अपने परम स्पेस के आकार को बढ़ा सकते हैं, लेकिन 100 या 200 पुनर्वित्त के बाद यह पूरा हो जाएगा। ट्रैकिंग क्लासलोडर मेमोरी लीक लगभग असंभव है।

उत्पादन सर्वर पर टोमकैट (या एक और सरल सर्वलेट कंटेनर - जेट्टी?) के लिए आपके तरीके क्या हैं? प्रत्येक समाधान को तैनात करने के बाद सर्वर पुनरारंभ होता है?

क्या आप कई अनुप्रयोगों के लिए एक टोमकैट का उपयोग करते हैं?

शायद मैं अलग बंदरगाहों (या एक एम्बेडेड घाट) पर कई जेट्टी सर्वर का उपयोग और undeploy/पुनः आरंभ करना चाहिए/हर बार तैनात?

+0

क्या आपने ढेर आकार बढ़ाने की कोशिश की है? – vsingh

+0

यह एक ढेर आकार की समस्या नहीं है, लेकिन कक्षा बाइटकोड अनलोडिंग समस्या है। वे कहते हैं कि कक्षाओं को JVM में अनलोड नहीं किया गया है और PermGen स्थान को साफ़ नहीं किया गया है। –

उत्तर

6

मैंने टॉमकैट प्रबंधक का उपयोग करने पर छोड़ दिया और अब हमेशा पुन: नियोजित करने के लिए टॉमकैट को बंद कर दिया।

हम एक ही सर्वर पर दो टॉमकैट चलाते हैं और mod_proxy_ajp के साथ अपाचे वेबसर्वर का उपयोग करते हैं ताकि उपयोगकर्ता एक ही पोर्ट 80 के माध्यम से दोनों ऐप्स एक्सेस कर सकें। यह भी अच्छा है क्योंकि उपयोगकर्ता टमाटर डाउन होने पर अपाचे सेवा अनुपलब्ध पृष्ठ देखते हैं।

+1

हम नीले-हरे परिनियोजन समाधान प्रदान करने के लिए हैपरॉक्स के पीछे विभिन्न बंदरगाहों पर दो टमाटर का उपयोग करते हैं। "ब्लू" सर्वर बंद हो जाता है जब "ग्रीन" चालू होता है और चल रहा है, तो हैप्रोक्सी तब "ग्रीन" पर स्विच हो जाता है। अगला तैनाती तब "ब्लू" पर जाती है। –

2

हाँ वास्तव में, यह एक समस्या है। हम टॉमकैट सर्वर पर तीन वेब ऐप्स चला रहे हैं: नंबर 1 वेब एप्लिकेशन फ्रेमवर्क, हाइबरनेट और कई अन्य JARs का उपयोग करता है, नहीं। 2 हाइबरनेट और कुछ जार और नहीं उपयोग करता है। 3 मूल रूप से एक बहुत ही सरल जेएसपी आवेदन है।

जब हम कोई तैनाती नहीं करते हैं। 1, हम हमेशा टोमकैट को पुनरारंभ करते हैं। अन्यथा एक PermGen अंतरिक्ष त्रुटि जल्द ही हमें काट देगा। संख्या 2 कभी-कभी समस्या के बिना तैनात किया जा सकता है, लेकिन जब यह अक्सर होता है तो यह अक्सर बदलता है। 1 भी करता है, वैसे भी एक पुनरारंभ निर्धारित है। संख्या 3 को कोई समस्या नहीं है और बिना किसी समस्या के जितनी बार तैनात किया जा सकता है।

तो, हाँ, हम आमतौर पर टॉमकैट को पुनरारंभ करते हैं। लेकिन हम टॉमकैट 7 की भी प्रतीक्षा कर रहे हैं, जो कि कई तीसरे पक्ष के जेएआर और ढांचे में फंस गए कई मेमोरी/क्लास लोडर समस्याओं को संभालने वाला है।

3

आप इन जावा विकल्प जोड़ने की कोशिश कर सकते हैं:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

यह (डिफ़ॉल्ट रूप से बंद) PermGen अंतरिक्ष में कचरा संग्रहण सक्षम बनाता है और जी सी कक्षाओं अनलोड करने के लिए अनुमति देता है। इसके अलावा आपको -XX का उपयोग करना चाहिए: PermSize = 64m -XX: MaxPermSize = 128m को कहीं भी PermGen की मात्रा बढ़ाने के लिए उल्लिखित किया गया है।

+2

इन्हें कैसे मदद की जानी चाहिए? – vsingh

1

आपको PermGen कचरा संग्रह सक्षम करना चाहिए। डिफ़ॉल्ट रूप से हॉटस्पॉट वीएम पर्मजेन कचरा नहीं एकत्र करता है, जिसका अर्थ है कि सभी लोड की गई क्लास फाइल हमेशा मेमोरी में रहती हैं। प्रत्येक नई तैनाती कक्षा फ़ाइलों का एक नया सेट लोड करती है जिसका अर्थ है कि आप अंततः पर्मजेन स्पेस से बाहर निकलते हैं।

हॉटस्पॉट में
+0

जैसा कि @ साउंडलिंक द्वारा नोट किया गया है, परमजेन में जीसी चालू करने के पैरामीटर "-XX: + CMSClassUnloadingEnabled -XX: + CMSPermGenSweepingEnabled" हैं। उबंटू पर आप इन्हें JAVA_OPTS में/etc/default/tomcat6 में जोड़ देंगे। – werkshy

2

PermGen स्विच समस्या सिर्फ देरी, और अंततः आप OutOfMemoryError वैसे भी मिल जाएगा।

हमें यह समस्या लंबे समय से मिली है, और मुझे अभी तक एकमात्र समाधान मिला है जो इसके बजाय जेआरॉकिट का उपयोग करना है। इसमें पर्मजेन नहीं है, इसलिए समस्या अभी गायब हो जाती है। हम अब हमारे परीक्षण सर्वर पर इसका मूल्यांकन कर रहे हैं, और स्विच के बाद से हमारे पास एक पर्मजेन समस्या नहीं है। मैंने अपनी स्थानीय मशीन पर 20 से अधिक बार एक ऐप के साथ पुन: नियोजित करने की भी कोशिश की जो इस त्रुटि को पहले पुनर्वित्त पर प्राप्त करता है, और सब कुछ खूबसूरती से चिपकाया जाता है।

JRockit OpenJDK में एकीकृत किया जा करने के लिए है, तो हो सकता है इस समस्या को शेयर जावा के लिए दूर भविष्य में भी जाना होगा के लिए है।

http://www.oracle.com/technetwork/middleware/jrockit/overview/index.html

और यह हॉटस्पॉट के रूप में नि: शुल्क है, एक ही लाइसेंस के तहत:

https://blogs.oracle.com/henrik/entry/jrockit_is_now_free_and

+0

मैंने सोचा कि जेरोकिट ढेर पर कक्षा परिभाषा रखता है। प्रत्येक पुनर्वितरण के बाद आपका ढेर बढ़ता नहीं है? ढेर आकार के बारे में "जेरोकिट मिशन कंट्रोल" क्या दिखाता है? –

+0

जहां तक ​​मैं देख सकता हूं, प्रत्येक पुनर्वितरण के बाद हीप एक ही आकार में रहता है। मैंने अभी लगभग 10 पुनर्वितरणों के साथ फिर कोशिश की। –

1

बिलाव का कौन सा संस्करण उपयोग कर रहे हैं? टॉमकैट 7 और 6.0.30 में इन लीक से बचने के लिए कई सुविधाएं हैं, या कम से कम आपको उनके कारण के बारे में चेतावनी दी गई है।

This presentation इस विषय पर स्प्रिंगसोर्स के मार्क थॉमस (और लंबे समय तक टॉमकैट कमिटर) द्वारा बहुत दिलचस्प है।

+0

प्रश्न 2010 में पूछा गया था। तब टोमकैट 7 योजनाओं में था। हमारा समाधान एक एप्लीकेशन था जो टोमकैट बंद कर देता था, बैकअप डीआईआर के लिए पुराने डब्ल्यूएआर की प्रतिलिपि बनाता है, हडसन से नया डब्ल्यूएआर डाउनलोड करता है, टॉमकैट शुरू करता है। हम दो टमाटर और नीले-हरे रंग की तैनाती पैटर्न का उपयोग करते हैं। –

1

संदर्भ के संदर्भ में, Plumbr उपकरण का एक नया संस्करण है, जो स्थायी जेनरेशन लीक की निगरानी और पहचान भी कर सकता है।