यह एक समस्या है जिसे मैं अभी कुछ महीनों के लिए ट्रैक करने की कोशिश कर रहा हूं। मेरे पास एक जावा ऐप है जो xml को प्रोसेस करता है और एक डेटाबेस में रिजल्ट को स्टोर करता है। आंतरायिक संसाधन समस्याएं हैं जिन्हें नीचे ट्रैक करना बहुत मुश्किल है।
पृष्ठभूमि: उत्पादन बॉक्स पर (जहां समस्या सबसे अधिक ध्यान देने योग्य है), मेरे पास बॉक्स तक विशेष रूप से अच्छी पहुंच नहीं है, और Jprofiler चलाने में असमर्थ है। वह बॉक्स 64 बिट क्वाड-कोर, 8 जीबी मशीन पर चलने वाला सेंटोस 5.2, टॉमकैट 6 और जावा 1.6.0.11 है। इसकी शुरुआत इन जावा-ऑप्स से होती है
JAVA_OPTS="-server -Xmx5g -Xms4g -Xss256k -XX:MaxPermSize=256m -XX:+PrintGCDetails -
XX:+PrintGCTimeStamps -XX:+UseConcMarkSweepGC -XX:+PrintTenuringDistribution -XX:+UseParNewGC"
प्रौद्योगिकी स्टैक निम्नलिखित है:
- सेंटोस 64-बिट 5.2
- जावा 6u11
- तोमक ६
- स्प्रिंग / वेबएमवीसी 2.5
- सीतनिद्रा में होना ३
- क्वार्ट्ज 1.6.1
- DBCP 1.2.1
- मायिकल 5.0.45
- Ehcache 1.5.0
- (और निश्चित रूप से अन्य निर्भरताओं के एक मेजबान, विशेष रूप से जकार्ता-कॉमन्स पुस्तकालयों)
समस्या को पुन: उत्पन्न करने के लिए निकटतम मैं एक 32-बिट मशीन हो सकती है जिसमें कम मेमोरी आवश्यकताएं हैं। कि मेरा नियंत्रण नहीं है। मैंने इसे JProfiler के साथ मौत के घाट उतार दिया है और कई प्रदर्शन समस्याओं (सिंक्रनाइज़ेशन समस्याओं, precompiling / कैशिंग xpath क्वेरीज़, थ्रेडपूल को कम करने, और अनावश्यक हाइबरनेट को हटाने, और प्रसंस्करण के दौरान अत्यधिक "कैश-वार्मिंग") को निर्धारित किया है।
प्रत्येक मामले में, प्रोफाइलर ने एक कारण या किसी अन्य के लिए भारी मात्रा में संसाधनों को लेने के रूप में दिखाया, और ये कि अब एक बार परिवर्तन होने के बाद प्राथमिक संसाधन हॉग नहीं थे।
समस्या: जेवीएम स्मृति उपयोग सेटिंग्स को पूरी तरह से अनदेखा करने के लिए लगता है, सभी मेमोरी को भरता है और अनुत्तरदायी बन जाता है। यह ग्राहक के अंत का सामना करने का मुद्दा है, जो एक नियमित मतदान (5 मिनट के आधार और 1 मिनट की रिट्री) की उम्मीद करता है, साथ ही साथ हमारे संचालन टीमों के लिए, जिन्हें लगातार सूचित किया जाता है कि एक बॉक्स अनुत्तरदायी बन गया है और इसे फिर से शुरू करना है। इस बॉक्स में कुछ और महत्वपूर्ण नहीं चल रहा है।
समस्या कचरा संग्रहण प्रतीत होती है। हम समवर्तीमार्टस्वीप का उपयोग कर रहे हैं (जैसा कि ऊपर उल्लेख किया गया है) कलेक्टर क्योंकि मूल एसटीडब्ल्यू कलेक्टर जेडीबीसी समयबाह्य कर रहे थे और तेजी से धीमी हो गई थी। लॉग दिखाते हैं कि जैसे-जैसे मेमोरी का उपयोग बढ़ता है, वैसे-वैसे सीएमएस विफलताओं को फेंकना शुरू होता है, और मूल स्टॉप-द-वर्ल्ड कलेक्टर को वापस मारता है, जो तब ठीक से इकट्ठा नहीं होता है।
हालाँकि, jprofiler के साथ चल रहा है, "Run GC" बटन एक बढ़ते पदचिह्न दिखाने के बजाय स्मृति को अच्छी तरह से साफ करने के लिए लगता है, लेकिन चूंकि मैं जिप्टाइलर को सीधे उत्पादन बॉक्स से नहीं जोड़ सकता हूं, और साबित हॉटस्पॉट्स को हल करने के लिए काम नहीं कर रहा हूं। ट्यूनिंग कचरा संग्रह अंधा के जादू के साथ छोड़ दिया।
मैंने क्या कोशिश की है:
- प्रोफाइलिंग और फिक्सिंग हॉटस्पॉट्स।
- एसटीडब्ल्यू, समानांतर और सीएमएस कचरा संग्राहकों का उपयोग करना।
- 1 / 2,2 / 4,4 / 5,6 / 6 वेतन वृद्धि पर न्यूनतम / अधिकतम आकार के साथ चल रहा है।
- 256M वेतन वृद्धि में permgen स्थान के साथ चल रहा है 1Gb तक।
- उपरोक्त के कई संयोजन।
- मैंने JVM [ट्यूनिंग संदर्भ] (http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html) से भी सलाह ली है, लेकिन वास्तव में इस व्यवहार या _which_ ट्यूनिंग के किसी भी उदाहरण की व्याख्या करते हुए कुछ भी नहीं पा सकते हैं। इस तरह की स्थिति में उपयोग करने के लिए पैरामीटर।
- मैंने ऑफलाइन मोड में जिप्सीलर की भी कोशिश की है, जोन्कोसोल, विजुअल्म से जुड़कर, लेकिन मुझे ऐसा कुछ भी नहीं मिल रहा है जो मेरे जीसी लॉग डेटा को इंटरप्रेट करे।
दुर्भाग्य से, समस्या भी छिटपुट रूप से पॉप हो जाती है, यह अप्रत्याशित लगता है, यह किसी भी समस्या के बिना दिनों या एक सप्ताह तक चल सकता है, या यह एक दिन में 40 बार विफल हो सकता है, और केवल एक चीज जिसे मैं लगातार पकड़ सकता हूं। वह कचरा संग्रहण कार्य कर रहा है।
क्या कोई भी इस बारे में कोई सलाह दे सकता है:
क) जेवीएम 8 भौतिक गिग्स और 2 जीबी स्वैप स्पेस का उपयोग क्यों कर रहा है जब इसे 6.
बी से कम पर अधिकतम करने के लिए कॉन्फ़िगर किया गया है ) जीसी ट्यूनिंग का एक संदर्भ जो वास्तव में समझाता है या उचित उदाहरण देता है कब और किस तरह की सेटिंग के साथ उन्नत संग्रह का उपयोग करें।
ग) सबसे आम जावा मेमोरी लीक का संदर्भ (मैं लावारिस संदर्भों को समझता हूं, लेकिन मेरा मतलब है कि लाइब्रेरी / फ्रेमवर्क स्तर पर, या डेटा संरचनाओं में कुछ और अधिक वारनेट, जैसे हैशैप्स)।
किसी भी और सभी जानकारी के लिए धन्यवाद जो आप प्रदान कर सकते हैं।
EDIT
एमिल एच:
1) हां, मेरा विकास क्लस्टर उत्पादन डेटा का एक दर्पण है, मीडिया सर्वर के नीचे। प्राथमिक अंतर 32/64 बिट और उपलब्ध RAM की मात्रा है, जिसे मैं बहुत आसानी से दोहरा नहीं सकता, लेकिन कोड और क्वेरीज़ और सेटिंग्स समान हैं।
2) कुछ विरासत कोड है जो कि जैक्सबी पर निर्भर है, लेकिन शेड्यूलिंग संघर्षों से बचने की कोशिश करने के लिए नौकरियों को पुन: व्यवस्थित करने में, मेरे पास उस निष्पादन को आम तौर पर समाप्त हो जाता है क्योंकि यह दिन में एक बार चलता है। प्राथमिक पार्सर XPath प्रश्नों का उपयोग करता है जो java.xml.xpath पैकेज के लिए कॉल करते हैं। यह कुछ हॉटस्पॉट्स का स्रोत था, एक के लिए प्रश्नों को पूर्व-संकलित नहीं किया जा रहा था, और उनमें से दो संदर्भ हार्डकोडिंग स्ट्रिंग्स में थे। मैंने थ्रेडसेफ़ कैश (हैशमैप) बनाया और अंतिम स्थैतिक स्ट्रिंग्स होने के लिए xpath प्रश्नों के संदर्भों को फैक्टर किया, जिससे संसाधन की खपत काफी कम हो गई। क्वेरी अभी भी प्रोसेसिंग का एक बड़ा हिस्सा है, लेकिन ऐसा इसलिए होना चाहिए क्योंकि यह एप्लिकेशन की मुख्य जिम्मेदारी है।
3) एक अतिरिक्त नोट, अन्य प्राथमिक उपभोक्ता JAI से इमेज ऑपरेशंस (फीड से इमेज को रीप्रोसेस करते हुए) है। मैं जावा के ग्राफिक पुस्तकालयों से अपरिचित हूं, लेकिन मैंने जो पाया है, वे विशेष रूप से लीक नहीं हैं।
(अब तक के जवाब के लिए धन्यवाद, दोस्तों!)
अद्यतन:
मैं VisualVM के साथ उत्पादन उदाहरण से कनेक्ट करने में सक्षम था, लेकिन इसने GC विज़ुअलाइज़ेशन / रन-GC विकल्प को अक्षम कर दिया था (हालांकि मैं इसे स्थानीय रूप से देख सकता था)। दिलचस्प बात यह है: VM का ढेर आवंटन JAVA_OPTS का पालन कर रहा है, और वास्तविक आवंटित ढेर 1-1.5 गिग्स पर आराम से बैठा है, और doesn't लीक हो रहा है, लेकिन बॉक्स स्तर की निगरानी अभी भी एक लीक पैटर्न दिखाती है, लेकिन यह है वीएम निगरानी में परिलक्षित नहीं। इस बॉक्स में और कुछ नहीं चल रहा है, इसलिए मैं स्तब्ध हूं।