2010-08-18 19 views
8

मुझे जेटी क्रैशिंग के साथ समस्याएं आ रही हैं, मैं जेटी 6.1.24 का उपयोग कर रहा हूं।जेटी क्रैशिंग के साथ समस्याएं

मैं एक neo4j स्प्रिंग एमवीसी वेबपैप चला रहा हूं, जेटी लगभग 1 घंटे तक चलती रहेगी और फिर मुझे जेटी को पुनरारंभ करना होगा। यह छोटे अमेज़ॅन ec2 उदाहरण, डेबियन पर 1.7 जीबी रैम के साथ चल रहा है।

मैं java -Xmx900m -server -jar start.jar

का उपयोग कर रहा सर्वर पोटीन का उपयोग कर से कनेक्ट कर रहा हूँ, जब घाट पोटीन सत्र डिस्कनेक्ट दुर्घटनाओं, मैं नहीं देख सकते हैं क्या त्रुटि यह दुर्घटना का कारण बना जेट्टी शुरू करते हैं।

मैं यह देखने में सक्षम होना चाहूंगा कि यह वसंत द्वारा उत्पन्न त्रुटि है या नहीं, मुझे यकीन नहीं है कि जेटी के साथ वसंत ऐप से आउटपुट लॉग कैसे करें। या यदि जेटी या स्मृति समस्या है, तो जेटी की निगरानी करने का सबसे अच्छा तरीका क्या होगा? मैं इसे अपने स्थानीय मशीन चलने वाली खिड़कियों पर फिर से नहीं बना सकता। आपको यह देखने का सबसे अच्छा तरीका क्या होगा? धन्यवाद

+0

क्या आप अपना प्रश्न स्पष्ट कर सकते हैं? "मेरे वेब ऐप के कंसोल" से आपका क्या मतलब है? क्या आपका वेब ऐप stdout (System.out) पर लॉगिंग भेज रहा है? आप किस ओएस पर चल रहे हैं? – Tim

+1

इस प्रश्न को सीडब्ल्यू क्यों चिह्नित किया गया है? – BalusC

+0

धन्यवाद मैं एक नया डेबियन EC2 उदाहरण शुरू कर दिया है, मैं घाट पुनः स्थापित होगा और मैं सभी सुझावों, यकीन नहीं है जो के रूप में वे सब अच्छा जवाब मदद के लिए – patrickandroid

उत्तर

4

जब आप दुर्घटना कहते हैं तो क्या आपका मतलब है कि JVM segfaults और गायब हो जाता है? अगर ऐसा होता है तो मैं जांच करता हूं और सुनिश्चित करता हूं कि आप मशीन की उपलब्ध स्मृति को थका नहीं रहे हैं।लिनक्स पर जावा क्रैश हो जाएगा जब सिस्टम मेमोरी इतनी कम हो जाती है कि जेवीएम अपनी अधिकतम मेमोरी तक आवंटित नहीं हो सकता है। उदाहरण के लिए, आपने 500 एमबी तक अधिकतम जेवीएम मेमोरी सेट की है जिसमें से इस समय 250 एमबी का उपयोग कर रहा है। हालांकि, लिनक्स ओएस में केवल 128 एमबी उपलब्ध है। यह अस्थिर परिणाम उत्पन्न करता है और JVM segfault जाएगा।

खिड़कियों JVM अधिक अच्छी तरह से इस परिदृश्य में व्यवहार किया और OutOfMemoryError फेंकता है जब सिस्टम स्मृति समाप्त हो रही है है पर।

  1. मान्य करें कि आपके क्रैश के समय सिस्टम मेमोरी कितनी उपलब्ध है।
  2. सत्यापित करें कि आपके बॉक्स पर अन्य प्रक्रियाएं बहुत मेमोरी खा रही हैं या नहीं। जेवीएम के साथ प्रतिस्पर्धा कर सकते हैं कि कुछ भी बंद करें।
  3. jconsole चलाएं और इसे अपने JVM से कनेक्ट करें। यह आपको बताएगा कि आपकी जेवीएम प्रक्रिया में स्मृति का उपयोग कैसे किया जा रहा है और आपको क्रैश होने पर वापस देखने के लिए इतिहास देता है।
  4. इस प्रकार के परीक्षण करते समय आप किसी भी मूल कोड को JVM में लोड कर सकते हैं।

मेरा मानना ​​है कि जेटी के पास उच्च मात्रा अनुरोध प्रक्रिया करने के लिए कुछ मूल कोड है। सुनिश्चित करें कि इसका उपयोग नहीं किया जा रहा है। आप जावा पर क्रैश को अलग करना चाहते हैं और कुछ अजीब देशी lib नहीं चाहते हैं। यदि आप मूल सामान लेते हैं और पाते हैं कि यह काम करता है तो आपके पास इसका जवाब है कि इसका क्या कारण है। यदि यह दुर्घटनाग्रस्त हो रहा है तो यह बहुत अच्छा हो सकता है जो मैं वर्णन कर रहा हूं।

आप -Xms900m साथ स्टार्टअप यकीन है कि JVM स्मृति के लिए अन्य प्रक्रियाओं के साथ लड़ाई नहीं है कर सकते हैं कि सभी स्मृति को आबंटित करने JVM मजबूर कर सकते हैं। एक बार जब यह पूर्ण एक्सएमएक्स राशि आवंटित हो जाए तो यह क्रैश नहीं होगा। समाधान नहीं है, लेकिन आप आसानी से इस तरह से परीक्षण कर सकते हैं। दुर्घटना के बाद

java -Xmx900m -server -jar start.jar > stdout.txt 2> stderr.txt 

, उन फ़ाइलों का निरीक्षण:

+0

धन्यवाद है , मैं आपके सभी सुझावों के लिए धन्यवाद – patrickandroid

+0

-Xms900m साथ घाट की शुरूआत में यह तय कर दी है करने के लिए लग रहा है, इस – patrickandroid

5

यह वास्तव में एक प्रोग्रामर प्रश्न नहीं है; शायद इसे सर्वरफॉल्ट पर ले जाया जाएगा।

आपने विशेष रूप से यह नहीं बताया कि आप किस ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं, लेकिन मैं कुछ लिनक्स वितरण पर अनुमान लगा रहा हूं। आपके पास क्या गलत है यह जानने के दो विकल्प हैं:

  1. स्क्रीन में अपना सत्र प्रारंभ करें। स्क्रीन तब तक लाइव रहेगी जब तक वास्तविक मशीन पर संचालित नहीं होती है, जब तक आप ऑपरेटिंग सिस्टम को रीबूट नहीं करते (या आप स्क्रीन से बाहर निकलें)।

    आप इस

    screen 
    

    की तरह स्क्रीन शुरू करने और आप एक नया शीघ्र जहाँ आप अपने कार्यक्रम (सीडी foo, घाट, आदि) शुरू कर सकते हैं मिलता है। जब आप खुश होते हैं और आपको कहीं कहीं जाना है, तो आप CTRL + A और फिर CTRL + D को मारकर स्क्रीन को डिस्कनेक्ट कर सकते हैं। screen पर आने से पहले आप उस स्थान पर वापस आ जाएंगे।

    screen देखने के लिए वापस पाने के लिए आप screen -R टाइप करें जिसका अर्थ है मौजूदा स्क्रीन को फिर से शुरू करना। आपको जेटी फिर से देखना चाहिए।

    अच्छी बात यह है कि यदि आप कनेक्शन खो देते हैं (या आप दुर्घटना या जो कुछ भी पास ही पोटीन) तो आप screen -list का उपयोग स्क्रीन चल की एक सूची प्राप्त कर सकते हैं, और फिर जबरन उन्हें -D को अलग कर उन्हें वर्तमान पोटीन -R को पुनः अनुलग्न है , कोई नुकसान नहीं किया!

  2. नोहप का उपयोग करें। नोहप कंसोल से चल रहे प्रक्रिया को कम या ज्यादा अलग करता है, इसलिए इसका कोई भी आउटपुट टर्मिनल पर आता है। आप अपना प्रोग्राम सामान्य फैशन में शुरू करते हैं, लेकिन आप अपने आदेश में nohup शब्द जोड़ते हैं।

    उदाहरण के लिए:

    nohup ls -l & 
    

    ls -l के बाद पूरा हो गया है, अपने उत्पादन nohup.out में संग्रहित है।

+0

धन्यवाद कर रहे हैं उपयोग करने के लिए जवाब देने की कोशिश करेंगे, स्क्रीन की मदद के लिए बहुत उपयोगी – patrickandroid

2

जब आप जावा शुरू करते हैं, एक फाइल करने के लिए दोनों आउटपुट (stdout और stderr) रीडायरेक्ट:

बैश का उपयोग करना।

तो दुर्घटना की वजह से एक संकेत करने के लिए (जैसे SEGV = विभाजन गलती) है, वहाँ स्थान आप जावा शुरू कर दिया है पर JVM द्वारा एक फ़ाइल डंप किया जाना चाहिए। सन वीएम (हॉटस्पॉट) के लिए, यह कुछ है hs_err_pid12121.log (यहां 12121 प्रक्रिया आईडी है)।

+0

धन्यवाद कोशिश करेंगे – patrickandroid

1

पोटीन दृढ़ता से डिस्कनेक्ट करने का संकेत देता है कि सर्वर स्मृति से बाहर चल रहा है और नीचे प्रक्रियाओं छोड़ दिया और सही बंद शुरू होता है है। यह शायद आपका जेटी उदाहरण बहुत बड़ा हो रहा है।

अब करने के लिए सबसे आसान बात है, 1-2 जीबी और स्वैप स्पेस जोड़ रहा है और इसे फिर से करें। यह भी ध्यान रखें कि आप रनटाइम जानकारी प्राप्त करने के लिए जेटी इंस्टेंस से अटैचमेंट करने के लिए jvisualvm का उपयोग कर सकते हैं।

+0

धन्यवाद किसी पाठ फ़ाइल में घाट से उत्पादन प्रवेश करने के लिए मेरे लिए आदर्श समाधान मैं का उपयोग कर अधिक स्वैप जोड़ा है: http: // www.debian-प्रशासन।org/लेख/550 – patrickandroid

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