जावा हीप डंप को मज़बूती से कैसे लें?


9

जब आउटऑफमेरीऑयर्स द्वारा ट्रिगर किए गए अच्छे हीप डंप लेने की कोशिश में मेरी टीम मुश्किलों में चल रही है। विशिष्ट कारणों के लिए हम वर्तमान में HeapDumpOnOutOfMemoryError ध्वज का उपयोग करने के बजाय bash स्क्रिप्ट से कॉल किए गए jmap के साथ डंप ले रहे हैं। हम 64-बिट 1.6 JVM का उपयोग कर रहे हैं, जिसमें 3 जीबी के आसपास ढेर का आकार है। हमारे ढेर डंप समय (guesstimate) के 90% विफल रहते हैं।

वहाँ कुछ भी हम एक स्वच्छ ढेर डंप हम स्मृति समस्याओं का निवारण करने के लिए उपयोग कर सकते हैं की हमारी बाधाओं में सुधार करने के लिए कर सकते है? मैंने पढ़ा है कि जावा 1.4 में jmap के प्रमुख मुद्दे थे लेकिन उन मुद्दों को अब ज्यादातर संबोधित किया जाना चाहिए।


4
मैं इस सवाल को "सबसे अनजाने घृणित-ध्वनि" के लिए नामांकित करता हूं।
फोएबस

1
हाहा- मैंने इसे जानबूझकर घृणित-ध्वनि बनाने के बारे में सोचा था लेकिन मैं यहां नया हूं और मुझे यकीन नहीं था कि समुदाय कैसे ले जाएगा :)।
कर्लियर

जवाबों:


7

आपका ऑपरेटिंग सिस्टम कौन सा है? (मैं टिप्पणी नहीं जोड़ सकता)।

सोलारिस के लिए हमें पहले एक कोर डंप ( gcore <pid>) मजबूर करने के लिए बेहतर परिणाम मिलते हैं और फिर जंप को कोर डंप फ़ाइल ( jmap -heap:format=b <path to java bin> <path to core>) में संलग्न करना होता है।

gcoreएक चल कार्यक्रम की एक छवि उत्पन्न करने के लिए एक * निक्स उपयोगिता है। देखें लिंक


linux पर gdb के साथ इसे आज़माया और यह बहुत अच्छा काम करता है।
क्रिश्चियन

कौन सा JDK में "gcore" है? मेरा, सन 32 बिट jdk लिनक्स के लिए 1.6.0.20 नहीं है।
djangofan

Gcore स्पष्टीकरण के साथ संपादित किया गया।
फर्गज़

2

हमारे पास एक JSP है, जो ManagementFactory.getThreadMXBean () पर सवाल करता है और एक रिपोर्ट तैयार करता है। हो सकता है कि ऐप क्रैश होने पर उपयोगी न हो, लेकिन यदि आप हर मिनट या तो मतदान करते हैं, तो आपको पता चल जाएगा कि क्या हो रहा है।

अधिक जानकारी यहाँ।


2

आप बाहर से jmx के माध्यम से अपने आवेदन की निगरानी कर सकते हैं। जब आप कुछ मेट्रिक्स जानते हैं जो आगामी आउटऑफमेरी का संकेत देते हैं, तो आप अपवाद को फेंकने से पहले एक जम्प रन को ट्रिगर कर सकते हैं।


धन्यवाद क्रिश्चियन- क्या त्रुटि फेंके जाने से पहले जम्प विश्वसनीय होने की अधिक संभावना है?
कर्लियर

एक ढेर डंप पाने के लिए अभी भी कुछ समय की आवश्यकता होगी। लेकिन जब तक आपका jvm / tomcat ज्यादातर ज़िम्मेदार नहीं होगा तब तक आपको एक पूरा ढेर मिलेगा।
क्रिश्चियन

मुझे लगता है कि ऐसा करने के लिए सबसे साफ और आसान उपकरण "विज़ुअल वीएम" है। यह स्कोप से बाहर हो सकता है, लेकिन विजुअलवीएम के लिए एक कस्टम प्लगइन बनाना जो कि स्थिति का पता लगाता है और विजुअलवीएम के भीतर से स्वचालित डंप लेता है, भयानक IMHO होगा।
djangofan

2

आपके सुझाव के लिए आप सभी का धन्यवाद।

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


2

यह एक काफी पुराना प्रश्न है, लेकिन मैं इस आशा के साथ उत्तर दूंगा कि किसी को यह उपयोगी लग सकता है।

जम्प में -F विकल्प (बल) होता है। यह मेरे लिए अतीत में उतना अच्छा काम नहीं साबित हुआ है। यदि आप -F विकल्प का उपयोग करने के लिए हैं, तो मैं सुझाव दूंगा कि आप java.io.tmp निर्देशिका को जम्प कमांड के एक भाग के रूप में भी निर्दिष्ट करें। JVM संस्करण 1.6.22 के साथ एक समस्या थी जहाँ टेम्प डाइरेक्टरी सेटिंग के कारण जाम्प उपयोगिता ठीक से काम नहीं करती थी।

आप gdb के माध्यम से एक कोर डंप लेने की कोशिश कर सकते हैं। एक बार आपके पास कोर होने के बाद, जेम कोर को एक ढेर डंप में बदल सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.