2012-06-19 17 views
8

में मैं कभी कभी VPS पर बिल्ला वेब अनुप्रयोग और बिल्ला है "जावा हॉटस्पॉट (टीएम) 64-बिट सर्वर वीएम चेतावनी अपवाद java.lang.OutOfMemoryError संकेत SIGTERM भेजने हैंडलर लिए हुआ" (के बारे में एक बार एक महीनेमैं मिलता है: त्रुटि बिल्ला

जावा हॉटस्पॉट (टीएम) 64-बिट सर्वर वीएम चेतावनी:) catalina.out में निम्न त्रुटि के साथ दुर्घटनाओं अपवाद java.lang.OutOfMemoryError संकेत SIGTERM भेजने वीएम handler- लिए हुआ जबरन समाप्त किया जा करना पड़ सकता है ।

  • वीपीएस:

यहाँ मेरी विन्यास के बारे में कुछ विवरण हैं डेबियन-5.0-x86_64

  • रैम: 2.5 जीबी,

  • आभासी प्रोसेसर: 8

  • एचडीडी: 60 जीबी एचडीडी - 70% मुफ्त

  • बिलाव 7,0

  • जावा -संस्करण:

    java version "1.6.0_18" 
    OpenJDK Runtime Environment (IcedTea6 1.8.13) (6b18-1.8.13-0+squeeze1) 
    OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode) 
    
  • जावा पैरामीटर: -Xms512m -Xmx1024m

  • मुझे लगता है कि सर्वर पर भी अपाचे-पीएचपी की है।

    मैं मुनिन के साथ सर्वर लोड की निगरानी कर रहा हूं और यह मुझे दिखाता है कि स्मृति और सीपीयू उपयोग हमेशा स्थिर रहता है और क्रैश से पहले कोई वृद्धि नहीं होती है।

    मैं java.lang.Runtime क्लास के माध्यम से जावा मेमोरी उपयोग भी लॉग कर रहा हूं, और यह दिखाता है कि जेवीएम हमेशा अधिकतम 200 एमबी मेमोरी का उपयोग करता है और क्रैश से पहले कोई वृद्धि नहीं हुई थी। दुर्घटना से पहले अंतिम लॉग 40 सेकंड पहले था और उस समय स्मृति का उपयोग किया गया था: 152 एमबी।

    मेरा वेब ऐप भी विभिन्न सार्वजनिक एपीआई से डेटा एकत्र करने वाले 6-7 धागे चलाता है। ये धागे तब शुरू होते हैं जब टोमकैट शुरू हो रहा है, और वे हमेशा आवधिक नींद के साथ चलते हैं।

    क्या आप कृपया मुझे बता सकते हैं कि यह क्यों दुर्घटनाग्रस्त हो जाता है? मुझे कारण कैसे मिल सकता है?

    उत्तर

    0
    • खोल से

      भागो top और देखो कितनी स्मृति लिनक्स का दावा है जावा प्रक्रिया में तेजी रही है।

    • मशीन में समग्र मेमोरी उपयोग की जांच करें। यह हो सकता है कि अन्य प्रक्रियाएं सभी मेमोरी का उपभोग कर रही हैं, लिनक्स को को मारने के लिए मजबूर कर रहा है JVM: MySQL या Postgress जैसे डेटाबेस संभावित संदिग्ध हैं।

    • असामान्य घटनाओं के लिए क्रैश के आसपास की अवधि के दौरान /var/log/messages जांचें।

    0

    आप service.bat या सेवा को संपादित कर सकते हैं।श फ़ाइल (deistribution के बिन फ़ोल्डर में पाया जाता है) और दो JVM पैरामीटर

    XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<PATH_TO_WRITE_DUMP> 
    

    नीचे डाल PATH_TO_WRITE_DUMP, आपके पास आवश्यक अनुमति चाहिए एक बार जब आप ढेर डंप फ़ाइल जो एक OutOfMemory मुद्दे के मामले में उत्पन्न हो जाएगा मिलता है, हाथ से या कुछ तीसरे पक्ष के उपकरण द्वारा इसका विश्लेषण करें। आप jvisualvm में इस फ़ाइल को लोड कर सकते हैं और कुछ विश्लेषण करते हैं या आप ग्रहण का मेमोरी-विश्लेषक-प्लगइन का उपयोग कर सकते हैं, यह बहुत उपयोगी है और कुछ संभावित स्मृति रिसाव संदिग्धों और dominator पेड़ देता है (यानी जो वस्तु ढेर हावी) यह एक हो सकता है अच्छा प्रारंभिक बिंदु।

    0

    वृद्धि आप बिल्ला जावा स्टार्टअप स्मृति, जैसे: सेट JAVA_OPTS = -server -Xms256m -Xmx512m

    0

    चलें इस फैलाना:

    अपवाद java.lang.OutOfMemoryError संकेत SIGTERM भेजने handler- लिए हुआ वीएम को जबरन समाप्त कर दिया जाना चाहिए।

    सबसे पहले, ऐसा लगता है कि कुछ ने जेवीएम (टोमकैट) प्रक्रिया को एक सिगरेट सिग्नल भेजा है। यह जेवीएम के लिए कुछ बाहरी होना चाहिए जो ऐसा करता है। एक JVM ही को संकेत भेजते नहीं है।

    तो तुम यह पता लगाने कि क्या कर रहा है की जरूरत है। मेरा अनुमान है कि पहला अनुमान ओओएम हत्यारा होगा ... लेकिन ओओएम हत्यारा सिग्कील का उपयोग सिगरेट नहीं करता है। और जेवीएम कभी सिगकिल नहीं देखता है!

    (आप इस बात की पुष्टि कर सकते हैं कि यह OOM किलर "/ var/log/संदेश" में देख कर नहीं है ... या जहाँ भी अपने सिस्टम लॉग गिरी संदेशों। How to Configure the Linux Out-of-Memory Killer देखें)

    यदि यह OOM नहीं है हत्यारा, तब वहाँ कुछ तरीके एक संकेत के स्रोत खोजने के लिए कर रहे हैं:

    और जैसे ही आप संकेत के स्रोत है, तो आप यह क्यों भेजा गया था के रूप में सुराग होगा।


    अन्य उल्लेखनीय बात यह है कि जबकि SIGTERM निपटने OutOfMemoryError हुआ है। यह दृढ़ता से (मेरे लिए) मूल कारण कुछ ने पाया है कि कि बिलाव बहुत अधिक स्मृति का उपयोग कर रहा है, और इसे दूर जाना (सफाई से) बनाने के लिए यह एक SIGTERM भेजा गया है कि पता चलता है। मुझे शंका है कि फिर क्या होता है कि JVM (SIGTERM को संभालने के लिए) में थोड़ा और अधिक स्मृति के लिए पूछने के ओएस के लिए चला जाता है और ओएस कहते हैं, "नहीं", और JVM एक OutOfMemoryError फेंकता है। दुर्भाग्यवश, JVM अब एक ऐसे राज्य में है जहां यह या तो साफ़ या पुनर्प्राप्त नहीं हो सकता है। इसलिए यह कहता है "वीएम को जबरन समाप्त कर दिया जाना चाहिए"।


    किसी भी तरह। यह मुझे एक सामान्य जावा समस्या के बजाय असामान्य अभिव्यक्ति की तरह दिखता है। आपके पास टॉमकैट में चल रहे वेबएप में सबसे अधिक संभावना है जो स्मृति को लीक कर रहा है। यदि ऐसा है, तो बग खोजने और ठीक करने का एकमात्र वास्तविक समाधान है। (ढेर आकार बढ़ाने से ... यदि संभव हो तो ... केवल समस्या दूर रखता है। यह दुर्घटनाओं के बीच अंतराल कम हो सकती है, लेकिन यह उन्हें रोकने के लिए की संभावना नहीं है।)

    यह मानते हुए कि आप गोली काटने के लिए तैयार हैं:


    1 - जब तक कुछ कुछ मूल कोड में अखरोट के कर रहा है ...

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