बड़े जावा हीप डंप का विश्लेषण करने के लिए उपकरण


80

मेरे पास एक हॉटस्पॉट जेवीएम हीप डंप है जिसका मैं विश्लेषण करना चाहूंगा। वीएम साथ चला -Xmx31g, और हीप डंप फ़ाइल 48 जीबी बड़ी है।

  • मैं कोशिश भी नहीं करूंगा jhat, क्योंकि इसमें लगभग पांच गुना ढेर मेमोरी की आवश्यकता होती है (जो कि मेरे मामले में 240 जीबी होगी) और भयानक रूप से धीमी है।
  • ArrayIndexOutOfBoundsExceptionकई घंटों के लिए ढेर डंप का विश्लेषण करने के बाद ग्रहण मेट दुर्घटनाग्रस्त हो जाता है ।

उस कार्य के लिए अन्य कौन से उपकरण उपलब्ध हैं? कमांड लाइन टूल का एक सूट सबसे अच्छा होगा, जिसमें एक प्रोग्राम शामिल होगा जो ढेर के डंप को विश्लेषण के लिए कुशल डेटा संरचनाओं में बदल देता है, जो कई अन्य टूल के साथ संयुक्त है जो प्री-स्ट्रक्चर्ड डेटा पर काम करते हैं।


क्या आप सुनिश्चित हैं कि डंप भ्रष्ट नहीं है और आप DTFJ JARs के अधिक हालिया संस्करण का उपयोग कर रहे हैं? ArrayIndexOutOfBoundsExceptionकम से कम में सुविधाओं दो कीड़े । मैं यह बता रहा हूँ क्योंकि आपने MAT को चलाने के दौरान किसी OOME की सूचना नहीं दी है , जिसका एक अलग निर्धारण है
विनीत रेनॉल्ड्स

jhat पढ़ी गई वस्तुओं को संग्रहीत करने के लिए heapMap का उपयोग करता है, जो ढेर में संग्रहीत वस्तुओं की संख्या के साथ तेजी से बढ़ता है। एक विकल्प यह है कि घोषणा के heapMap से TreeMap में परिवर्तित करें, और अपनी प्रक्रिया के रूप में jhat के हीप आकार को कम से कम चलाएं।
कोडर

जवाबों:


80

आम तौर पर, मैं जो भी उपयोग करता हूं वह एक्लिप्स मेमोरी एनालाइजर केParseHeapDump.sh भीतर शामिल है और यहां वर्णित है , और मैं ऐसा करता हूं कि हमारे एक और अधिक बीफेड सर्वर (डाउनलोड करें और लिनक्स पर कॉपी करें। ज़िप डिस्ट्रो, अनज़िप)। शेल स्क्रिप्ट को GUI से हीप को पार्स करने की तुलना में कम संसाधनों की आवश्यकता होती है, साथ ही आप इसे अपने बीफ़ सर्वर पर अधिक संसाधनों के साथ चला सकते हैं (आप स्क्रिप्ट की अंतिम पंक्ति के अंत में कुछ ऐसा जोड़कर अधिक संसाधन आवंटित कर सकते हैं । उदाहरण के लिए। संशोधन के बाद उस फ़ाइल की अंतिम पंक्ति इस तरह दिख सकती है-vmargs -Xmx40g -XX:-UseGCOverheadLimit

./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@" -vmargs -Xmx40g -XX:-UseGCOverheadLimit

इसे वैसे ही चलाएं ./path/to/ParseHeapDump.sh ../today_heap_dump/jvm.hprof

उसके बाद सफल होने पर, यह .hprof फ़ाइल के बगल में "इंडेक्स" फ़ाइलों की संख्या बनाता है।

सूचकांकों को बनाने के बाद, मैं उस से रिपोर्ट उत्पन्न करने की कोशिश करता हूं और उन रिपोर्टों को अपनी स्थानीय मशीनों को सौंपता हूं और यह देखने की कोशिश करता हूं कि क्या मैं अपराधी को सिर्फ उसी से मिल सकता हूं (न केवल रिपोर्टों से, बल्कि सूचकांकों से)। रिपोर्ट बनाने का ट्यूटोरियल यहां दिया गया है

उदाहरण रिपोर्ट:

./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects

अन्य रिपोर्ट विकल्प:

org.eclipse.mat.api:overview तथा org.eclipse.mat.api:top_components

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

संपादित करें: मुझे सिर्फ दो नोट जोड़ना पसंद है:

  • जहां तक ​​मैं जानता हूं, केवल सूचकांकों की पीढ़ी ही ईएलटीई मैट का मेमोरी इंटेंसिव पार्ट है। आपके पास सूचकांकों के बाद, ग्रहण मेट से आपके अधिकांश प्रसंस्करण को उतनी मेमोरी की आवश्यकता नहीं होगी।
  • शेल स्क्रिप्ट पर ऐसा करने का मतलब है कि मैं इसे एक हेडलेस सर्वर पर कर सकता हूं (और मैं इसे सामान्य रूप से हेडलेस सर्वर पर भी कर सकता हूं, क्योंकि वे सामान्य रूप से सबसे शक्तिशाली होते हैं)। और अगर आपके पास एक सर्वर है जो उस आकार के ढेर डंप को उत्पन्न कर सकता है, तो संभावना है, आपके पास एक और सर्वर है जो उस ढेर के ढेर को भी संसाधित कर सकता है।

4
महत्वपूर्ण नोट: ParseHeapDump.shकेवल लिनक्स संस्करण के साथ पैक किया गया है, न कि OSX संस्करण - eclipse.org/mat/downloads.php
क्रिस्टोफर

जब मैं यह कोशिश करता हूं (एक linux बॉक्स पर बश करने के लिए), यह "GTK + को इनिशियलाइज़ करने में असमर्थ" के साथ तुरंत विफल हो जाता है। तो ऐसा लगता है (वर्तमान संस्करण, 2016-04-15) अभी भी सोचता है कि यह यूआई (?) से बात कर रहा है।
चार्ल्स रोथ

2
हम्म, ParseHeapDump.sh के नए संस्करण चलाना चाहते हैं ।/MemoryAnalyzer सीधे। मैं लॉन्चर को सीधे जावा के साथ चलाने के साथ प्रयोग कर रहा हूं, अब तक जो काम कर रहा है, जैसे java -Xmx16g -Xms16g -jar plugins / org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar -consoleLog -consolelog-application org.eclipse.mat.api.parse "$ @"
चार्ल्स रोथ

प्रकट होता है कि आप लिनक्स और OSX दोनों संस्करणों को डाउनलोड करके OS X पर इसका उपयोग कर सकते हैं, फिर ParseHeapDump.sh को उसी मेमोरी में कॉपी कर सकते हैं जैसे कि आपकी MemoryAnalyze फ़ाइल (मेरे मामले में, ~ / डाउनलोड / mat.app / कंट्रोवर्सी / MacOS) और संशोधित करें इसे वहाँ चलाओ। या एसएसएच :) के माध्यम से इसे कुछ दूरस्थ सर्वर पर
चलाएं

500MB से अधिक मेमोरी का उपयोग करके ग्रहण मेमोरी एनालाइज़र GUI के साथ 2GB हीप डंप खोला। फ़ाइल खोलने पर फ्लाई पर इंडेक्स फाइलें बनाई गईं (लिया ~ 30sec)। शायद उन्होंने उपकरण में सुधार किया। यह आगे और पीछे बड़ी फ़ाइलों की तुलना में अधिक आश्वस्त है, अगर यह वास्तव में इस तरह से काम करता है। बिना किसी कंसोल उपयोगिताओं के भी छोटी मेमोरी फुटप्रिंट मेरे लिए एक बड़ा प्लस है। लेकिन ईमानदार होने के लिए, मैंने इसे वास्तव में बड़े डंप (50+ जीबी) के साथ करने की कोशिश नहीं की । बहुत दिलचस्प है कि इस उपकरण के साथ इतने बड़े डंप को खोलने और विश्लेषण करने के लिए कितनी मेमोरी की आवश्यकता होती है।
रुस्लान

6

इस संबंधित प्रश्न का स्वीकृत उत्तर आपके लिए एक अच्छी शुरुआत प्रदान करता है (हीप डंप के बजाय लाइव जम्प हिस्टोग्राम का उपयोग करता है):

बड़े जावा हीप डंप में मेमोरी लीक खोजने की विधि

अधिकांश अन्य हीप विश्लेषक (मैं आईबीएम http://www.alphaworks.ibm.com/tech/heapanalyzer का उपयोग करता है ) यदि आप एक अच्छा GUI उपकरण की उम्मीद कर रहे हैं, तो हीप की तुलना में कम से कम RAM का प्रतिशत आवश्यक है।

इसके अलावा, कई डेवलपर्स वैकल्पिक दृष्टिकोण का उपयोग करते हैं, जैसे लाइव स्टैक विश्लेषण का अनुमान लगाने के लिए कि क्या चल रहा है।

हालांकि मुझे यह सवाल करना चाहिए कि आपके ढेर इतने बड़े क्यों हैं? आवंटन और कचरा संग्रह पर प्रभाव बड़े पैमाने पर होना चाहिए। मैं शर्त लगाता हूं कि आपके ढेर में जो कुछ भी है वह वास्तव में एक डेटाबेस / एक स्थिर कैश आदि में संग्रहीत होना चाहिए।


5

मैं सुझाव है कि YourKit की कोशिश कर रहा हूँ। यह आमतौर पर ढेर डंप आकार की तुलना में थोड़ी कम मेमोरी की आवश्यकता होती है (यह इसे अनुक्रमित करता है और उस जानकारी का उपयोग करता है जो आप चाहते हैं)


4

कुछ और विकल्प:

यह व्यक्ति http://blog.ragozin.info/2015/02/programatic-heapdump-analysis.html

वास्तव में स्मृति में फ़ाइल लोड करने के बजाय, ढेर डंप फ़ाइल के माध्यम से एक "क्वेरी शैली" इंटरफ़ेस को उजागर करता है कि एक कस्टम Netbeans हीप विश्लेषक लिखा था।

https://github.com/aragozin/jvm-tools/tree/master/hprof-heap

हालांकि मुझे नहीं पता कि "उसकी क्वेरी भाषा" स्वीकार किए गए उत्तर में उल्लिखित ग्रहण से बेहतर है।

JProfiler 8.1 (उपयोगकर्ता लाइसेंस के लिए $ 499) को बहुत अधिक धन का उपयोग किए बिना बड़े ढेर को पार करने में सक्षम होने के लिए भी कहा जाता है।


वास्तव में github.com/on-site/fasthat के विपरीत, एक बड़े डंप पर काम करता है । अच्छा लगा!
जेसी Glick

4

पहला चरण: MAT को आप जो आवंटित कर रहे हैं, उसमें RAM की मात्रा बढ़ाएं। डिफ़ॉल्ट रूप से यह बहुत ज्यादा नहीं है और यह बड़ी फाइलें नहीं खोल सकता है।

मैक पर OS (OSX) का उपयोग करने के मामले में, आपके पास MemoryAnalyzer.ini फ़ाइल MemoryAnalyzer.app/Contents/MacOS में होगी। यह मेरे लिए उस फ़ाइल में समायोजन करने के लिए काम नहीं कर रहा था और उन्हें "लेना" था। आप इसके बजाय इस फ़ाइल की सामग्री के आधार पर एक संशोधित स्टार्टअप कमांड / शेल स्क्रिप्ट बना सकते हैं और इसे उस निर्देशिका से चला सकते हैं। मेरे मामले में मैं 20 जीबी हीप चाहता था:

./MemoryAnalyzer -vmargs -Xmx20g --XX:-UseGCOverheadLimit ... other params desired

जीयूआई को अधिक रैम के साथ शुरू करने के लिए, टर्मिनल के माध्यम से सामग्री / मैकओएस निर्देशिका से इस कमांड / स्क्रिप्ट को चलाएं।


धन्यवाद। उपयोगिता आज डीएल। 2x-क्लिक द्वारा चलाया गया और इसने एक त्रुटि दी। लॉग देखा, डेटा फ़ाइल नहीं बना सका और एक स्विच का उपयोग करने के लिए कहा। .App पैकेज खोला और Eclipse \ फ़ोल्डर में MemoryAnalyzer.ini पाया, न कि \ MacOS। आह-हा! इसलिए मैंने स्थानीय रूप से सभी फाइलों को निकाला और जैसा कि आपने सुझाव दिया था। मैंने एक .sh फ़ाइल in \ MacOS बनाया और एक समतल रेखा के रूप में Eclipse \ MemoryAnalyzer.ini में कमांड को स्थानांतरित किया। फ़ाइल सहेज ली गई। कमांड लाइन और वॉइला पर MacOS \ से .sh फाइल को रन किया, यह काम किया।
मैट कैंपबेल

2

एक बहुत प्रसिद्ध उपकरण नहीं है - http://dr-brenschede.de/bheapsampler/ बड़े ढेर के लिए अच्छी तरह से काम करता है। यह नमूना द्वारा काम करता है, इसलिए इसे पूरी बात को पढ़ना नहीं है, हालांकि थोड़ा बारीक है।


दुर्भाग्य से यह कहता है "आम समस्या: स्मृति से बाहर चल रहा है: -Xmx को 2/3 तक बढ़ाएं डंप-आकार" !
rogerdpack

2

एक्लिप्स मेमोरी एनालाइज़र के नवीनतम स्नैपशॉट बिल्ड में मेमोरी की खपत को कम करने और शेष वस्तुओं का विश्लेषण करने की अनुमति देने के लिए वस्तुओं के एक निश्चित प्रतिशत को बेतरतीब ढंग से त्यागने की सुविधा है। MAT की अगली रिलीज़ में शामिल होने से पहले इस सुविधा का परीक्षण करने के लिए बग 563960 और रात के स्नैपशॉट बिल्ड देखें ।


1

यह एक कमांड लाइन समाधान नहीं है, हालांकि मुझे उपकरण पसंद हैं:

यह होस्ट करने के लिए बड़े सर्वर पर ढेर डंप की प्रतिलिपि बनाएँ। यह बहुत अच्छी तरह से संभव है कि मूल सर्वर का उपयोग किया जा सकता है।

ssh -Xदूरस्थ रूप से ग्राफ़िकल टूल को चलाने के लिए सर्वर के माध्यम से दर्ज करें और ढेर डंप jvisualvmकी .hprofफ़ाइल को लोड करने के लिए जावा बाइनरी निर्देशिका से उपयोग करें ।

उपकरण एक ही बार में पूरे ढेर डंप को मेमोरी में लोड नहीं करता है, लेकिन जब आवश्यक हो तो भागों को लोड करता है। बेशक, यदि आप फ़ाइल में पर्याप्त चारों ओर देखते हैं तो आवश्यक मेमोरी अंत में ढेर डंप के आकार तक पहुंच जाएगी।


0

Jprofiler का उपयोग करने का प्रयास करें, बड़े का विश्लेषण करने में इसका काम अच्छा है। शुद्ध, मैंने 22 जीबी के आसपास फ़ाइल आकार के साथ प्रयास किया है।

https://www.ej-technologies.com/products/jprofiler/overview.html

0

मुझे JXray नाम का एक दिलचस्प टूल आया। यह सीमित मूल्यांकन परीक्षण लाइसेंस प्रदान करता है। मेमोरी लीक को खोजने के लिए यह बहुत उपयोगी पाया गया। आप इसे एक शॉट दे सकते हैं।

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