Windows पर जावा प्रक्रिया का एक थ्रेड और हीप डंप कैसे प्राप्त करें जो कंसोल में नहीं चल रहा है


232

मेरे पास एक जावा एप्लिकेशन है जिसे मैं एक कंसोल से चलाता हूं जो बदले में एक और जावा प्रक्रिया को निष्पादित करता है। मैं उस बच्चे की प्रक्रिया का एक थ्रेड / हीप डंप प्राप्त करना चाहता हूं।

यूनिक्स पर, मैं कर सकता था, kill -3 <pid>लेकिन विंडोज एएफएआईके पर एक ही तरीका है कि थ्रेड डंप हो कंसोल में Ctrl-ब्रेक है। लेकिन यह मुझे केवल माता-पिता की प्रक्रिया की डंप देता है, बच्चे को नहीं।

वहाँ एक और तरीका है कि ढेर डंप पाने के लिए है?


जवाबों:


376

आप jmapकिसी भी प्रक्रिया के डंप पाने के लिए उपयोग कर सकते हैं , यह मानते हुए कि आप जानते हैं pid

प्राप्त करने के लिए टास्क मैनेजर या रिसोर्स मॉनिटर का उपयोग करें pid। फिर

jmap -dump:format=b,file=cheap.hprof <pid>

उस प्रक्रिया के लिए ढेर पाने के लिए।


विंडोज़ में JDK5 के लिए jmap उपलब्ध नहीं है। खिड़कियों पर JDK5 के साथ डंप लेने का कोई तरीका है?
सैंट्रोन मणिभारती

173
यह धागा इतना लोकप्रिय हो गया है कि मैंने सिर्फ किसी को एक "सस्ते.बिन" के रूप में ढेर डंप का जिक्र करते सुना है
mjaggard

7
एक और अधिक सीधा नाम: "heap.hprof", क्योंकि यह HPROF प्रारूप में है।
एमजीएम

1
सही उपयोगकर्ता का उपयोग करना सुनिश्चित करें जिसने जावा प्रक्रिया शुरू की। मेरे मामले में यह tomcat8 ps -C java -o pid sudo -u tomcat8 jmap -dump: format = b, file = <filename> <pid>
bitabhi

115

आप दो अलग-अलग जावा डंप को भ्रमित कर रहे हैं। kill -3थ्रेड डंप उत्पन्न करता है, न कि ढेर डंप।

थ्रेड डंप = JVM आउटपुट में प्रत्येक थ्रेड के लिए स्टैक को पाठ के रूप में स्टडआउट करने के लिए।

एक द्विआधारी फ़ाइल के लिए जेवीएम प्रक्रिया आउटपुट के लिए ढेर डंप = मेमोरी सामग्री।

विंडोज पर थ्रेड डंप लेने के लिए, CTRL+ BREAKयदि आपकी जेवीएम अग्रभूमि प्रक्रिया है तो सबसे सरल तरीका है। यदि आपके पास विंडोज पर साइक्सविन या मोब्क्टरम जैसे यूनिक्स जैसा शेल है, तो kill -3 {pid}आप यूनिक्स में जैसे चाहें उपयोग कर सकते हैं।

यूनिक्स में एक थ्रेड डंप लेने के लिए, CTRL+ Cयदि आपकी जेवीएम अग्रभूमि प्रक्रिया है या kill -3 {pid}जब तक आप जेवीएम के लिए सही पीआईडी ​​प्राप्त नहीं करेंगे, तब तक काम करेंगे।

या तो मंच के साथ, जावा कई उपयोगिताओं के साथ आता है जो मदद कर सकते हैं। थ्रेड डंप के लिए, jstack {pid}आपका सबसे अच्छा दांव है। http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html

बस डंप सवाल को खत्म करने के लिए: हीप डंप का आमतौर पर उपयोग नहीं किया जाता है क्योंकि उन्हें व्याख्या करना मुश्किल है। लेकिन, उनमें बहुत सारी उपयोगी जानकारी होती है यदि आप जानते हैं कि उन्हें कहाँ / कैसे देखना है। मेमोरी लीक का पता लगाने के लिए सबसे आम उपयोग है। यह -Dजावा कमांड-लाइन पर सेट करने के लिए एक अच्छा अभ्यास है ताकि ढेर डंप स्वचालित रूप से एक आउटऑफमेरीऑयर पर उत्पन्न होता है, -XX:+HeapDumpOnOutOfMemoryError लेकिन, आप मैन्युअल रूप से एक ढेर डंप को ट्रिगर कर सकते हैं, भी। सबसे आम तरीका है जावा उपयोगिता का उपयोग करना jmap

नोट: यह उपयोगिता सभी प्लेटफार्मों पर उपलब्ध नहीं है। JDK 1.6 के रूप में, jmapविंडोज पर उपलब्ध है।

एक उदाहरण कमांड-लाइन कुछ इस तरह दिखाई देगी

jmap -dump:file=myheap.bin {pid of the JVM}

आउटपुट "myheap.bin" मानव पठनीय नहीं है (हम में से अधिकांश के लिए), और आपको इसका विश्लेषण करने के लिए एक उपकरण की आवश्यकता होगी। मेरी प्राथमिकता MAT है। http://www.eclipse.org/mat/


3
मेरे लिनक्स में Ctrl-C इसे बाधित करता है (समाप्त करता है), मैं Ctrl- \
nafg

"विंडोज, CTRL + BREAK पर थ्रेड डंप लेने के लिए" इस पर और इसके सामान्य प्रभाव पर विचार करें । यह वास्तव में निर्माता के इंजीनियरिंग निर्णय पर निर्भर है। फे, लेनोवा, IIRC, cntrl + fn + p है।
चीफट्वेनपेंसिल्स

30

मैं बनाने के लिए .hprof लिनक्स प्रक्रिया में फ़ाइल के साथ है सबसे अच्छा तरीका लगता है jmap आदेश। उदाहरण के लिए:jmap -dump:format=b,file=filename.hprof {PID}


19

उल्लेखित जोंक / विज़ुअल्म का उपयोग करने के अलावा, आप jstack -l <vm-id>दूसरी कमांड लाइन विंडो पर उपयोग कर सकते हैं, और उस आउटपुट को कैप्चर कर सकते हैं।

<Vm-id> को टास्क मैनेजर का उपयोग करके पाया जा सकता है (यह विंडोज़ और यूनिक्स पर प्रक्रिया आईडी है), या उपयोग कर रहा है jps

दोनों jstackऔर jpsसन जेडडीके संस्करण 6 और उच्चतर में शामिल हैं।


ये उपकरण जावा 1.6 में समर्थित नहीं हैं। Java 1.6 में केवल jconsole है।
वंचिनाथन चंद्रशेखरन

7
आप JDK और JRE को मिला सकते हैं, मैंने स्पष्ट रूप से JDK का उल्लेख किया है। टूल के लिए दस्तावेज़ देखें: download.oracle.com/javase/6/docs/technotes/tools/share/… और download.oracle.com/javase/6/docs/technotes/tools/share//
ankon

17

मैं JDK (jvisualvm.exe) के साथ वितरित किए गए जावा विजुअलवीएम की सिफारिश करता हूं। यह गतिशील रूप से कनेक्ट हो सकता है और थ्रेड्स और ढेर तक पहुंच सकता है। मैंने कुछ समस्याओं के लिए अमूल्य पाया है।


2
यह ज्यादातर समय संभव नहीं है क्योंकि इसमें ओवरहेड जुड़ा होता है और थ्रेड डंप आमतौर पर उत्पादन मशीनों से प्राप्त होते हैं।
हमाद दर

मूल प्रश्न 'नॉट-रनरिन' प्रक्रिया के बारे में है। यह संभावना है कि jvisualvm कनेक्ट नहीं हो सकता है।
जाबेरिनो

3
@ जाबेरिनो: नहीं, यह वर्तमान में चल रही जावा प्रक्रिया के बारे में है, विंडोज में, इसके साथ कोई कंसोल नहीं है।
लॉरेंस डॉल

नवीनतम जावा रिलीज में जावा विजुअलवीएम को जेएमसी / जेएफआर द्वारा सुपरसीड किया गया था । यह भी देखें कि JVisualVM और Java मिशन नियंत्रण में क्या अंतर हैं?
वडज़िम

16

यदि आप सर्वर- jre 8 और इसके बाद के संस्करण का उपयोग कर सकते हैं:

jcmd PID GC.heap_dump /tmp/dump

1
अधिकांश उत्पादन प्रणालियों में, हमारे पास केवल jre है और jdk नहीं है। तो इससे मदद मिलती है।
प्रागलथन एम

15

नीचे दिए गए विकल्पों में से एक का प्रयास करें।

  1. 32 बिट JVM के लिए:

    jmap -dump:format=b,file=<heap_dump_filename> <pid>
  2. 64 बिट जेवीएम (स्पष्ट रूप से उद्धृत) के लिए:

    jmap -J-d64 -dump:format=b,file=<heap_dump_filename> <pid>
  3. VM पैरामीटर में G1GC एल्गोरिथ्म के साथ 64 बिट JVM के लिए (केवल लाइव ऑब्जेक्ट हीप G1GC एल्गोरिदम के साथ उत्पन्न होता है):

    jmap -J-d64 -dump:live,format=b,file=<heap_dump_filename> <pid>

संबंधित एसई प्रश्न: जेम्प कमांड के साथ जावा हीप डंप त्रुटि: समयपूर्व ईओएफ

jmapइस लेख के विभिन्न विकल्पों पर एक नज़र डालें


13

यदि आप आउट-ऑफ-मेमोरी पर एक हेम्पडंप चाहते हैं, तो आप विकल्प के साथ जावा शुरू कर सकते हैं -XX:-HeapDumpOnOutOfMemoryError

cf JVM विकल्प संदर्भ पृष्ठ


धन्यवाद डैनियल। यह फाइल एक विंडोज़ मशीन पर कहाँ बनाई गई है? क्या कोई डिफ़ॉल्ट पथ है?
लावा

1
@ लावा आप ओरेकल के वीएम ऑप्शंस पेज पर बताए गए तरीके से -एक्सएक्स: हेपडंपपथ पर सेट कर सकते हैं ।
kamczak

बहुत बढ़िया। मैं स्मृति रिसाव दिखाने की उम्मीद में रात भर एक परीक्षण चलाना चाहता था लेकिन मैं मौजूद नहीं होने पर OOM और दुर्घटनाग्रस्त होने से चिंतित था। यह पूर्ण है।
तुलसी

7

आप चला सकते हैं jconsole(जावा 6 के एसडीके के साथ शामिल) तो अपने जावा एप्लिकेशन से कनेक्ट करें। यह आपको प्रत्येक थ्रेड रनिंग और उसके स्टैक ट्रेस दिखाएगा।


अब तक का सबसे अच्छा जवाब! यह अब तक का पता नहीं था और यह वास्तव में व्यावहारिक है!
ज़ेरुस

7

आप kill -3 <pid>Cygwin से भेज सकते हैं । आपको psविंडोज़ प्रक्रियाओं को खोजने के लिए सिग्विन विकल्पों का उपयोग करना होगा फिर बस उस प्रक्रिया को सिग्नल भेजें।


5

आपको दूसरी java निष्पादन योग्य से आउटपुट को कुछ फ़ाइल में पुनर्निर्देशित करना होगा। फिर, SendSignal का उपयोग अपनी दूसरी प्रक्रिया के लिए "-3" भेजने के लिए करें।


लेकिन विंडोज पर jstack अधिक विश्वसनीय विकल्प होने का अनुमान लगा रहा है: stackoverflow.com/a/47723393/603516
वडज़िम

3

यदि आप JDK 1.6 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो आप jmapजावा प्रक्रिया के ढेर डंप को लेने के लिए कमांड का उपयोग कर सकते हैं , शर्त है कि आपको प्रोसेसआईडी ज्ञात होना चाहिए।

यदि आप विंडोज मशीन पर हैं, तो आप पीआईडी ​​प्राप्त करने के लिए टास्क मैनेजर का उपयोग कर सकते हैं। लिनक्स मशीन के लिए आप की तरह आदेश की किस्मों का उपयोग कर सकते ps -A | grep javaया netstat -tupln | grep javaया top | grep java, आपके आवेदन पर निर्भर करता है।

फिर आप कमांड का उपयोग कर सकते हैं जैसे jmap -dump:format=b,file=sample_heap_dump.hprof 1234कि 1234 पीआईडी ​​है।

वहाँ की किस्में हैं उपलब्ध उपकरण HPROF फ़ाइल व्याख्या करने के लिए। मैं ओरेकल के विज़ुव्म टूल की सिफारिश करूंगा, जो उपयोग करने के लिए सरल है।


3

यदि आप किसी कारण से कंसोल / टर्मिनल का उपयोग नहीं कर सकते हैं (या नहीं चाहते हैं), तो वैकल्पिक समाधान है। आप जावा एप्लिकेशन को आपके लिए थ्रेड डंप प्रिंट कर सकते हैं। Stack Trace को इकट्ठा करने वाला कोड उचित सरल होता है और इसे एक बटन या वेब इंटरफेस से जोड़ा जा सकता है।

private static String getThreadDump() {
    Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces();

    StringBuilder out = new StringBuilder();
    for (Map.Entry<Thread, StackTraceElement[]> entry : allStackTraces.entrySet()) {
        Thread thread = entry.getKey();
        StackTraceElement[] elements = entry.getValue();
        out.append(String.format("%s | prio=%d | %s", thread.getName(), thread.getPriority(), thread.getState()));
        out.append('\n');

        for (StackTraceElement element : elements) {
            out.append(element.toString()).append('\n');
        }
        out.append('\n');
    }
    return out.toString();
}

यह विधि इस तरह दिखने वाली एक स्ट्रिंग लौटाएगी:

main | prio=5 | RUNNABLE
java.lang.Thread.dumpThreads(Native Method)
java.lang.Thread.getAllStackTraces(Thread.java:1607)
Main.getThreadDump(Main.java:8)
Main.main(Main.java:36)

Monitor Ctrl-Break | prio=5 | RUNNABLE
java.net.PlainSocketImpl.initProto(Native Method)
java.net.PlainSocketImpl.<clinit>(PlainSocketImpl.java:45)
java.net.Socket.setImpl(Socket.java:503)
java.net.Socket.<init>(Socket.java:424)
java.net.Socket.<init>(Socket.java:211)
com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:59)

Finalizer | prio=8 | WAITING
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

Reference Handler | prio=10 | WAITING
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:502)
java.lang.ref.Reference.tryHandlePending(Reference.java:191)
java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

धाराओं के साथ जावा 8 संस्करण में रुचि रखने वालों के लिए, कोड और भी अधिक कॉम्पैक्ट है:

private static String getThreadDump() {
    Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces();
    StringBuilder out = new StringBuilder();
    allStackTraces.forEach((thread, elements) -> {
        out.append(String.format("%s | prio=%d | %s", thread.getName(), thread.getPriority(), thread.getState()));
        out.append('\n');

        Arrays.stream(elements).forEach(element -> out.append(element.toString()).append('\n'));
        out.append('\n');
    });
    return out.toString();
}

आप इस कोड को आसानी से जांच सकते हैं:

System.out.print(getThreadDump());

3

निम्न स्क्रिप्ट किसी अन्य Windows सत्र से कनेक्ट करने के लिए PsExec का उपयोग करता है इसलिए यह दूरस्थ डेस्कटॉप सेवा के माध्यम से कनेक्ट होने पर भी काम करता है।

मैंने नामित जावा 8 (उपयोग PsExecऔर jcmd) के लिए एक छोटी सी बैच स्क्रिप्ट लिखी है jvmdump.bat, जो थ्रेड्स, हीप, सिस्टम प्रॉपर्टीज और जेवीएम आर्ग्स को डंप करती है।

:: set the paths for your environment
set PsExec=C:\Apps\SysInternals\PsExec.exe
set JAVA_HOME=C:\Apps\Java\jdk1.8.0_121
set DUMP_DIR=C:\temp

@echo off

set PID=%1

if "%PID%"=="" (
    echo usage: jvmdump.bat {pid}
    exit /b
)

for /f "tokens=2,3,4 delims=/ " %%f in ('date /t') do set timestamp_d=%%h%%g%%f
for /f "tokens=1,2 delims=: " %%f in ('time /t') do set timestamp_t=%%f%%g
set timestamp=%timestamp_d%%timestamp_t%
echo datetime is: %timestamp%

echo ### Version >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"
%PsExec% -s %JAVA_HOME%\bin\jcmd.exe %PID% VM.version >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"

echo. >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"
echo ### Uptime >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"
%PsExec% -s %JAVA_HOME%\bin\jcmd.exe %PID% VM.uptime >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"

echo. >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"
echo ### Command >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"
%PsExec% -s %JAVA_HOME%\bin\jcmd.exe %PID% VM.command_line >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"

echo. >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"
echo ### Flags >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"
%PsExec% -s %JAVA_HOME%\bin\jcmd.exe %PID% VM.flags >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"

echo. >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"
echo ### Properties >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"
%PsExec% -s %JAVA_HOME%\bin\jcmd.exe %PID% VM.system_properties >>"%DUMP_DIR%\%PID%-%timestamp%-jvm.log"

%PsExec% -s %JAVA_HOME%\bin\jcmd.exe %PID% Thread.print -l >"%DUMP_DIR%\%PID%-%timestamp%-threads.log"

%PsExec% -s %JAVA_HOME%\bin\jcmd.exe %PID% GC.heap_dump "%DUMP_DIR%\%PID%-%timestamp%-heap.hprof"

echo Dumped to %DUMP_DIR%

इसे उसी उपयोगकर्ता के विंडोज सत्र में चलाया जाना चाहिए, जिसने JVM की शुरुआत की थी, इसलिए यदि आप रिमोट डेस्कटॉप से ​​जुड़ते हैं, तो आपको कमांड प्रॉम्प्ट लॉन्च करने Session 0और इसे वहां से चलाने की आवश्यकता हो सकती है । जैसे

%PsExec% -s -h -d -i 0 cmd.exe

यह आपको View the messageइंटरएक्टिव सेशन में (टास्कबार आइकन पर क्लिक करें) प्रॉम्प्ट करेगा , जो आपको दूसरे सेशन में नए कंसोल पर ले जाएगा जहां से आप jvmdump.batस्क्रिप्ट चला सकते हैं ।


2

जावा आवेदन की प्रक्रिया आईडी कैसे प्राप्त करें?

जावा अनुप्रयोगों की प्रक्रिया आईडी प्राप्त करने के लिए कमांड 'jcmd' निष्पादित करें।

थ्रेड डंप कैसे प्राप्त करें?

jcmd PID Thread.print> thread.dump

संदर्भ लिंक

आप थ्रेड डंप पाने के लिए jstack का भी उपयोग कर सकते हैं (jstack PID> thread.dump)। संदर्भ लिंक

कैसे करें ढेर डंप?

हीप डंप प्राप्त करने के लिए जंप टूल का उपयोग करें। jmap -F -dump: live, format = b, file = heap.bin PID

पीआईडी ​​आवेदन की प्रक्रिया आईडी के लिए है। संदर्भ लिंक


1

शायद jcmd ?

JcmM के लिए डायग्नोस्टिक कमांड अनुरोध भेजने के लिए Jcmd उपयोगिता का उपयोग किया जाता है, जहां ये अनुरोध जावा फ़्लाइट रिकॉर्डिंग, समस्या निवारण और JVM और जावा एप्लिकेशन के निदान के लिए उपयोगी होते हैं।

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

यह प्रक्रिया आपको इनवॉइस करने में उपयोग करने की आवश्यकता होगी jcmd:

  1. के लिए जाओ jcmd <pid> GC.heap_dump <file-path>
  2. जिसमें
  3. pid: एक Java प्रोसेस आईडी है, जिसके लिए ढेर डंप को भी कैप्चर किया जाएगा
  4. फ़ाइल-पथ: एक फ़ाइल पथ है जिसमें हीप डंप मुद्रित किया गया है।

जावा हीप डंप लेने के बारे में अधिक जानकारी के लिए इसे देखें ।


0

विजुअलवम फॉलोअप:

यदि आप jvisualvm से अपने रनिंग JVM से "कनेक्ट नहीं" कर सकते हैं क्योंकि आपने इसे सही JVM तर्कों से शुरू नहीं किया था (और यह रिमोट बॉक्स पर है) jstatd, तो रिमोट बॉक्स पर चलाएं , फिर मान लें कि आपका सीधा संबंध है, जोड़ें विजुअल्म में इसे "रिमोट होस्ट" के रूप में, होस्ट नाम पर डबल क्लिक करें, और उस बॉक्स के अन्य सभी जेवीएम जादुई रूप से विजुअल्म में दिखाई देंगे।

यदि आपके पास उस बॉक्स पर पोर्ट के लिए "डायरेक्ट कनेक्शन" नहीं है, तो आप इसे प्रॉक्सी के माध्यम से भी कर सकते हैं ।

एक बार जब आप अपनी इच्छित प्रक्रिया देख सकते हैं, तो इसे jvisualvm में ड्रिल करें और मॉनिटर टैब -> "हीडंपंप" बटन का उपयोग करें।


0

जावा कोड के नीचे पीआईडी ​​प्रदान करके जावा प्रोसेस के हीप डंप प्राप्त करने के लिए उपयोग किया जाता है। कार्यक्रम ढेर डंप करने के लिए रिमोट JMX कनेक्शन का उपयोग करता है। यह किसी एक के लिए मददगार हो सकता है।

import java.lang.management.ManagementFactory;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.lang.reflect.Method;

public class HeapDumper {

public static final String HOST = "192.168.11.177";
public static final String PORT = "1600";
public static final String FILE_NAME = "heapDump.hprof";
public static final String FOLDER_PATH = "C:/";
private static final String HOTSPOT_BEAN_NAME ="com.sun.management:type=HotSpotDiagnostic";

public static void main(String[] args) {
    if(args.length == 0) {
        System.out.println("Enter PID of the Java Process !!!");
        return;
    }

    String pidString = args[0];
    int pid = -1;
    if(pidString!=null && pidString.length() > 0) {
        try {
            pid = Integer.parseInt(pidString);
        }
        catch(Exception e) {
            System.out.println("PID is not Valid !!!");
            return;
        }
    }
    boolean isHeapDumpSuccess = false;
    boolean live = true;
    if(pid > 0) {
        MBeanServerConnection beanServerConn = getJMXConnection();

        if(beanServerConn!=null) {
            Class clazz = null;
            String dumpFile = FOLDER_PATH+"/"+FILE_NAME;
            try{
                clazz = Class.forName("com.sun.management.HotSpotDiagnosticMXBean");
                Object hotspotMBean = ManagementFactory.newPlatformMXBeanProxy(beanServerConn, HOTSPOT_BEAN_NAME, clazz);
                Method method = clazz.getMethod("dumpHeap", new Class[]{String.class , boolean.class});
                method.setAccessible(true);
                method.invoke(hotspotMBean , new Object[] {dumpFile, new Boolean(live)});
                isHeapDumpSuccess = true;
            }
            catch(Exception e){
                e.printStackTrace();
                isHeapDumpSuccess = false;
            }
            finally{
                clazz = null;
            }
        }
    }

    if(isHeapDumpSuccess){
        System.out.println("HeapDump is Success !!!");
    }
    else{
        System.out.println("HeapDump is not Success !!!");
    }
}

private static MBeanServerConnection getJMXConnection() {
    MBeanServerConnection mbeanServerConnection = null;
    String urlString = "service:jmx:rmi:///jndi/rmi://" + HOST + ":" + PORT + "/jmxrmi";
    try {
        JMXServiceURL url = new JMXServiceURL(urlString);
        JMXConnector jmxConnector = JMXConnectorFactory.connect(url);
        mbeanServerConnection = jmxConnector.getMBeanServerConnection();
        System.out.println("JMX Connection is Success for the URL :"+urlString);
    }
    catch(Exception e) {
        System.out.println("JMX Connection Failed !!!");
    }
    return mbeanServerConnection;
}

}


0

खिड़कियों में एक बच्चे जावा प्रक्रिया से धागा डंप / हीप डंप लेने के लिए, आपको पहले चरण के रूप में बच्चे की प्रक्रिया आईडी की पहचान करने की आवश्यकता है।

कमांड जारी करके: jps आप सभी java प्रोसेस Ids प्राप्त कर पाएंगे जो कि आपके विंडोज़ मशीन पर चल रहे हैं। इस सूची से आपको बाल प्रक्रिया आईडी का चयन करना होगा। एक बार जब आपके पास बाल प्रक्रिया आईडी होती है, तो थ्रेड डंप और ढेर डंप को पकड़ने के लिए विभिन्न विकल्प होते हैं।

थ्रेडिंग डंप कैप्चर करना:

थ्रेड डंप को पकड़ने के लिए 8 विकल्प हैं:

  1. jstack
  2. मारना -3
  3. jvisualVM
  4. जेएमसी
  5. विंडोज (Ctrl + ब्रेक)
  6. ThreadMXBean
  7. एपीएम उपकरण
  8. jcmd

प्रत्येक विकल्प के बारे में विवरण इस लेख में पाया जा सकता है । एक बार जब आप थ्रेड डंप पर कब्जा कर लेते हैं, तो आप फास्टट्रैड जैसे उपकरणों का उपयोग कर सकते हैं , सैम्यूरिटो थ्रेड डंप का विश्लेषण करते हैं।

हीप डंप पर कब्जा:

ढेर ढेर को पकड़ने के लिए 7 विकल्प हैं:

  1. jmap

  2. -XX: + HeapDumpOnOutOfMemoryError

  3. jcmd

  4. JVisualVM

  5. JMX

  6. प्रोग्रामेटिक दृष्टिकोण

  7. प्रशासनिक शान्ति

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


-1

Oracle JDK पर, हमारे पास एक कमांड है जिसे jmap (जावा होम के बिन फ़ोल्डर में उपलब्ध) कहा जाता है। कमांड का उपयोग निम्नानुसार आता है

jmap (विकल्प) (पीआईडी)

उदाहरण: jmap -dump: लाइव, प्रारूप = b, फ़ाइल = heap.bin (pid)

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