मैं -hprof फ़ाइल का विश्लेषण कैसे करूँ?


227

मेरे पास निम्न ध्वज के साथ एक उत्पादन सर्वर चल रहा है: - XX: + HeapDumpOnOutOfMemoryError

कल रात जब हमारे सर्वर को ढेर त्रुटि का सामना करना पड़ा, तो यह एक java-38942.hprof फ़ाइल उत्पन्न करता है। यह पता चला है कि सिस्टम के डेवलपर्स को ध्वज के बारे में पता था, लेकिन इससे कोई उपयोगी जानकारी प्राप्त करने का कोई तरीका नहीं था।

कोई विचार?

जवाबों:


215

यदि आप एक गंभीर उन्नत उपकरण चाहते हैं, तो चारों ओर कुछ गंभीर प्रहार करने के लिए, ग्रहण पर मेमोरी एनालाइज़र परियोजना देखें , एसएपी के लिए उनके साथ योगदान दिया।

मेमोरी लीक आदि को खोजने के लिए आप जो कुछ कर सकते हैं, वह मन-ही-अच्छा है - इन-मेमोरी ऑब्जेक्ट्स के विरुद्ध सीमित एसक्यूएल (ओक्यूएल) का एक रूप चलाने सहित, अर्थात

StString (firstName) सेलेक्ट करें। com.yourcompany.somepackage.User से

पूरी तरह से शानदार।


18
मैं सिर्फ ग्रहण मेमोरी एनालाइज़र के लिए +100 जोड़ना चाहूंगा। मैं वर्तमान में 400mb + हीप डंप फ़ाइल के माध्यम से sift करने का प्रयास कर रहा हूं, और फ़ाइल को पढ़ने में 70 मिनट से अधिक समय का समय लगा, इससे पहले कि यह पूरी तरह से JVM क्रैश हो गया। ईएमए <5 मिनट में इसे खोलने में सक्षम है।
मैट बी

3
जब मैं ग्रहण मेमोरी एनालाइज़र का उपयोग करके HPROF फ़ाइलों को खोल रहा हूं, तो मुझे पार्स करने में त्रुटि हो रही है (जो कि वास्तव में ग्रहण द्वारा डंप की गई थी!)। बदकिस्मत .. आहें।
खोया_बिट्स 1110 22:14

3
MAT को अभी भी काफी RAM की आवश्यकता हो सकती है [JHAT से कम लेकिन फिर भी काफी थोड़ी]। यदि आप ऐसा हो रहा है तो सुझावों के लिए stackoverflow.com/questions/7254017/… देखें ।
रोज़गारपैक

71

आप JHK के साथ डिफ़ॉल्ट रूप से प्रदान किए गए JHAT , The Java हीप विश्लेषण उपकरण का उपयोग कर सकते हैं । यह कमांड लाइन है, लेकिन एक वेब सर्वर / ब्राउज़र शुरू करता है जिसका उपयोग आप मेमोरी की जांच करने के लिए करते हैं। सबसे उपयोगकर्ता के अनुकूल नहीं है, लेकिन कम से कम यह पहले से ही स्थापित है सबसे अधिक स्थानों पर आप जाएंगे। एक बहुत ही उपयोगी दृश्य बहुत नीचे स्थित "हीप हिस्टोग्राम" लिंक है।

उदाहरण के लिए: jhat -port 7401 -J-Xmx4G dump.hprof

jhat OQL "इन दिनों" के रूप में अच्छी तरह से निष्पादित कर सकते हैं (नीचे लिंक "निष्पादित OQL")


कमांड के ऊपर चलने के बाद कंसोल में आपको संदेश मिलेगा कि टर्मिनल "सर्वर तैयार है" पोर्ट: 7401। इसके बाद इस URL को खोलें: localhost: 7401 "आप ब्राउज़र विंडो में विवरण देख सकते हैं"।
लक्ष्मण जी

35

आप नेटवेयर्स प्रॉइलर या विजुअल वीएम स्टैंड-अलोन टूल से भी हेपवॉकर का उपयोग कर सकते हैं। विजुअल वीएम JHAT का एक अच्छा विकल्प है क्योंकि यह अकेले खड़ा है, लेकिन JHAT की तुलना में इसका उपयोग करना बहुत आसान है।

विजुअल वीएम का पूरी तरह से उपयोग करने के लिए आपको जावा 6+ की आवश्यकता है।


आपको एक नोट जोड़ना चाहिए कि यह केवल जावा 6 और 7 के लिए है।
निक स्टिनमेट्स

AFAIK, HeapWalker और VisualVM को HP 6F फाइल पढ़ने के लिए Java 6/7 की आवश्यकता नहीं है।
Sc में जेम्स स्कैच

मैंने अभी इसे जावा 5 के साथ लोड करने की कोशिश की और यह कहा कि 'कृपया जावा 6 या 7 का उपयोग करें' मैं क्या गलत कर रहा हूं?
निक Stinemates

हम्म। शायद आपको जावा 6 चलाना है, लेकिन एक जावा 5 एचपीआरओएफ पढ़ सकते हैं (शायद यही मुझे काम करने के लिए मिला है)। मुझे पता है कि आप जावा ऐप चलाने वाले ऐप पर विजुअल वीएम से ढेर-डंप नहीं बना सकते। अपडेट करेंगे।
जेम्स स्कैच

के लिए देखो - तुम भी, दृश्य JVM उपयोग कर सकते हैं जावा एसडीके से jvisualvm.exeपर JAVASDK/binफ़ोल्डर
xxxvodnikxxx

11

बस ग्रहण मेमोरी एनालाइज़र प्राप्त करें । वहाँ कुछ भी बेहतर नहीं है और यह मुफ़्त है।

JHAT केवल "खिलौना अनुप्रयोगों" के लिए उपयोग करने योग्य है


3
JHAT उन "l33t" हैकर्स को प्रभावित करने के लिए आवश्यक है जो LILO से शुरू होने वाले BSD डिस्ट्रो को हाथ से बनाते हैं। रुको ... वे वैसे भी जावा का उपयोग कभी नहीं करेंगे। :-)
जेम्स स्कैच

मुझे लगता है कि यह एक टिप्पणी से अधिक है ...: \
rogerdpack


5

यदि आप अपने heapdump का एक कस्टम विश्लेषण करना चाहते हैं तो वहाँ है:

यह लाइब्रेरी तेज़ है लेकिन आपको अपना विश्लेषण कोड जावा में लिखना होगा।

डॉक्स से:

  • हीप डंप को संसाधित करने के लिए डिस्क पर कोई अस्थायी फ़ाइलें नहीं बनाता है
  • सीधे GZ संकुचित हीप डंप काम कर सकते हैं
  • हयपाथ संकेतन

2

मैं व्यक्तिगत रूप से VisualVM को पसंद करता हूं। VisualVM में मुझे जो सुविधाएँ पसंद हैं उनमें से एक ढेर डंप तुलना है। जब आप एक ढेर डंप विश्लेषण कर रहे हैं तो दुर्घटना के कारण का पता लगाने के विभिन्न तरीके हैं। जिन तरीकों से मैंने उपयोगी पाया है उनमें से एक स्वस्थ बनाम अस्वस्थ हीप डंप की तुलना कर रहा है।

इसके लिए आप निम्नलिखित चरणों का पालन कर सकते हैं:

  1. OutOfMemoryError का ढेर डंप हो जाने पर इसे "oome.hprof" कहें। आप इसे JVM पैरामीटर HeapDumpOnOutOfMemoryError के माध्यम से प्राप्त कर सकते हैं।
  2. एप्लिकेशन को पुनरारंभ करें इसे अपने आवेदन के आधार पर एक बड़े (मिनट / घंटे) तक चलने दें। एक और ढेर डंप करें, जबकि आवेदन अभी भी चल रहा है। चलो इसे "स्वस्थ। लाभ" कहते हैं।
  3. आप VisualVM में इन दोनों डंपों को खोल सकते हैं और ढेर डंप तुलना कर सकते हैं। आप इसे क्लास या पैकेज स्तर पर कर सकते हैं। यह अक्सर आपको मुद्दे की दिशा में इंगित कर सकता है।

लिंक: https://visualvm.github.io

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