উইন্ডোজে জাভা প্রক্রিয়াটির কোনও থ্রেড এবং হিপ ডাম্প কীভাবে পাবেন যা কোনও কনসোলে চলছে না


232

আমার কাছে একটি জাভা অ্যাপ্লিকেশন রয়েছে যা আমি কনসোল থেকে চালিত যা ফলস্বরূপ অন্য একটি জাভা প্রক্রিয়া চালায়। আমি সেই শিশু প্রক্রিয়াটির একটি থ্রেড / হিপ ডাম্প পেতে চাই।

ইউনিক্সে, আমি kill -3 <pid>উইন্ডোজ এএফএইচ-তে কিছু করতে পারি তবে থ্রেড ডাম্প পাওয়ার একমাত্র উপায় হ'ল কনসোলের Ctrl-Break। তবে এটি আমাকে সন্তানের নয়, পিতামাতার প্রক্রিয়াটির ডাম্প দেয়।

সেই হিপ ডাম্প পাওয়ার আর কি উপায় আছে?


উত্তর:


376

আপনি যে jmapকোনও প্রক্রিয়া চালিয়ে যাচ্ছেন তা ধরে নিয়ে আপনি ডাম্প পেতে ব্যবহার করতে পারেন pid

এটি পেতে টাস্ক ম্যানেজার বা রিসোর্স মনিটর ব্যবহার করুন pid। তারপর

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

যে প্রক্রিয়া জন্য গাদা পেতে।


jmap উইন্ডোজে JDK5 এর জন্য উপলব্ধ নয়। উইন্ডোজে জেডিকে 5 দিয়ে ডাম্প নেওয়ার কোনও উপায় আছে কি?
স্যান্ট্রন মণিভারতী

173
এই থ্রেডটি এতটাই জনপ্রিয় হয়ে উঠেছে যে আমি কেবল শুনেছি যে কেউ একজন "সস্তার.বিন" হিসাবে গাদা ডাম্পকে উল্লেখ করছে
এমজাগার্ড

7
আরও সহজবোধ্য ফাইলের নাম: "হিপ এইচ.আর.পি.", যেমনটি এইচপিআরএফ ফর্ম্যাটে রয়েছে।
এমজিএম

1
জাভা প্রক্রিয়া শুরু হয়েছে এমন সঠিক ব্যবহারকারীর ব্যবহার নিশ্চিত করুন। আমার ক্ষেত্রে এটি ছিল টমক্যাট 8 পিএস-সি জাভা -o পিড সুডো-টোমক্যাট 8 জ্যাম্যাপ -ডাম্প: ফর্ম্যাট = বি, ফাইল = <ফাইল নাম> <
পিড

115

আপনি দুটি ভিন্ন জাভা ডাম্প গুলিয়ে ফেলছেন। kill -3একটি থ্রেড ডাম্প উত্পাদন করে, হিপ ডাম্প নয়।

থ্রেড ডাম্প = জেভিএম আউটপুটে প্রতিটি থ্রেডের জন্য পাঠ্য হিসাবে স্টডআউট করার জন্য স্ট্যাক ট্রেস।

বাইনারি ফাইলে JVM প্রসেস আউটপুটের জন্য হিপ ডাম্প = মেমরির সামগ্রী।

Windows এ একটি থ্রেড ডাম্প নিতে, 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" আউটপুটটি মানব পাঠযোগ্য নয় (আমাদের বেশিরভাগের জন্য), এবং এটি বিশ্লেষণ করার জন্য আপনার একটি সরঞ্জামের প্রয়োজন হবে। আমার পছন্দ ম্যাট। http://www.eclipse.org/mat/


3
আমার লিনাক্সে Ctrl-C এটি বাধা দেয় (সমাপ্ত করে), আমি Ctrl- do
এনএফজি ২

এটি এবং "উইন্ডোজে থ্রেড ডাম্প নিতে, সিটিআরএল + BREAK" এর সাধারণ প্রভাব বিবেচনা করুন । এটি আসলে প্রস্তুতকারকের ইঞ্জিনিয়ারিং সিদ্ধান্তের উপর নির্ভরশীল। এফই, লেনোভা, আইআইআরসি, সিএনটিআরএল + এফএন + পি।
চিফ টুপেনসিলস

30

আমি মনে করি লিনাক্স প্রসেসে .hprof ফাইল তৈরির সর্বোত্তম উপায় হ'ল jmap কমান্ড। উদাহরণ স্বরূপ:jmap -dump:format=b,file=filename.hprof {PID}


19

উল্লিখিত জকনসোল / ভিজ্যুয়ালভিএম ব্যবহার করা ছাড়াও, আপনি jstack -l <vm-id>অন্য কমান্ড লাইন উইন্ডোতে ব্যবহার করতে পারেন এবং সেই আউটপুট ক্যাপচার করতে পারেন।

<vm-id> টাস্ক ম্যানেজার ব্যবহার করে (এটি উইন্ডোজ এবং ইউনিক্সের প্রক্রিয়া আইডি) ব্যবহার করে বা ব্যবহার করে খুঁজে পাওয়া যাবে jps

উভয়ই jstackএবং jpsসান জেডিকে সংস্করণ and এবং এর চেয়ে বেশি এর মধ্যে অন্তর্ভুক্ত।


এই সরঞ্জামগুলি জাভা 1.6 এ সমর্থিত নয়। জাভা 1.6 এ কেবল জকনসোল রয়েছে।
ভানচিনাথন চন্দ্রশেকরন

7
আপনি জেডিকে এবং জেআরই মিশ্রণ করছেন, আমি জেডিকে স্পষ্টভাবে উল্লেখ করেছি। সরঞ্জামের ডকুমেন্টেশন দেখুন: 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
@ জাবেরিনো: না, এটি উইন্ডোতে বর্তমানে চলছে এমন একটি জাভা প্রক্রিয়া সম্পর্কে, যার সাথে কোনও কনসোল যুক্ত নেই।
লরেন্স ডল

সর্বশেষ জাভা রিলিজ জাভা VisualVM দ্বারা সংযোজন করা হয়েছিল JMC / JFR । এছাড়াও দেখুন JVisualVM এবং জাভা মিশন নিয়ন্ত্রণের মধ্যে পার্থক্যগুলি কী?
ভাদজিম

16

আপনি যদি সার্ভার-জে 8 তে বা তার উপরে থাকেন তবে আপনি এটি ব্যবহার করতে পারেন:

jcmd PID GC.heap_dump /tmp/dump

1
বেশিরভাগ প্রোডাকশন সিস্টেমে আমাদের কাছে কেবল জেডি থাকে এবং জেডিকে নয়। সুতরাং এটি সাহায্য করে।
প্রাগলাথন এম

15

নীচের বিকল্পগুলির মধ্যে একটি ব্যবহার করে দেখুন।

  1. 32 বিট জেভিএমের জন্য:

    jmap -dump:format=b,file=<heap_dump_filename> <pid>
  2. 64 বিট জেভিএমের জন্য (স্পষ্টভাবে উদ্ধৃতি):

    jmap -J-d64 -dump:format=b,file=<heap_dump_filename> <pid>
  3. ভিএম প্যারামিটারগুলিতে জি 1 জিসি অ্যালগরিদম সহ 64 বিট জেভিএম-এর জন্য (কেবল লাইভ অবজেক্টস হিপ জি 1 জি সি অ্যালগরিদম দিয়ে উত্পন্ন হয়):

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

সম্পর্কিত SE প্রশ্ন: jmap কমান্ডের সাথে জাভা হিপ ডাম্প ত্রুটি: অকাল ইওএফ

jmapএই নিবন্ধে বিভিন্ন অপশন দেখুন


13

আপনি যদি মেমোরির বাইরে হিপডাম্প চান তবে আপনি জাভাটি বিকল্পটি দিয়ে শুরু করতে পারেন -XX:-HeapDumpOnOutOfMemoryError

সিএফ জেভিএম বিকল্প রেফারেন্স পৃষ্ঠা


ধন্যবাদ ড্যানিয়েল উইন্ডোজ মেশিনে এই ফাইলটি কোথায় তৈরি করা হয়েছে? কোন ডিফল্ট পথ আছে?
লাভা

1
@ ললাভা আপনি -XX এর মাধ্যমে পথ নির্ধারণ করতে পারেন: হেপডাম্পপ্যাথ, যেমন ওরাকলের ভিএম বিকল্প পৃষ্ঠাতে বর্ণিত ।
কামচাক

অসাধারণ. মেমরি ফাঁস দেখানোর আশায় আমি রাতারাতি একটি পরীক্ষা চালাতে চেয়েছিলাম তবে আমি উপস্থিত না থাকায় ওওএম এবং ক্র্যাশাইন নিয়ে চিন্তিত ছিলাম। এটি নিখুঁত।
বেসিল

7

আপনি চালাতে পারেন jconsole(জাভা 6 এর এসডিকে অন্তর্ভুক্ত) এর পরে আপনার জাভা অ্যাপ্লিকেশনটির সাথে সংযোগ স্থাপন করুন। এটি আপনাকে প্রতিটি থ্রেড চলমান এবং এর স্ট্যাক ট্রেস প্রদর্শন করবে।


এখন পর্যন্ত সেরা উত্তর! এটি এখনও অবধি জানা ছিল না এবং এটি সত্যিই বাস্তব!
জেরাস

7

আপনি kill -3 <pid>সাইগউইন থেকে প্রেরণ করতে পারেন । psউইন্ডোজ প্রক্রিয়াগুলি খুঁজতে আপনাকে সাইগউইন বিকল্পগুলি ব্যবহার করতে হবে তবে কেবল সেই প্রক্রিয়াতে সংকেত প্রেরণ করুন।


5

আপনাকে দ্বিতীয় জাভা এক্সিকিউটেবল থেকে কিছু ফাইলের আউটপুট পুনর্নির্দেশ করতে হবে। তারপরে, আপনার দ্বিতীয় প্রক্রিয়াতে "-3" প্রেরণের জন্য সেন্ড সিগন্যাল ব্যবহার করুন ।


তবে জেস্ট্যাকটি উইন্ডোজে আরও নির্ভরযোগ্য বিকল্প হিসাবে প্রমাণিত হয়েছে: 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 পিআইডি রয়েছে।

এইচপিআরএফ ফাইলটি ব্যাখ্যা করার জন্য বিভিন্ন ধরণের সরঞ্জাম উপলব্ধ রয়েছে । আমি ওরাকল এর ভিজ্যুভ্যুল সরঞ্জামটি সুপারিশ করব যা ব্যবহার করা সহজ।


3

আপনি যদি কোনও কারণে কনসোল / টার্মিনালটি ব্যবহার করতে (বা চান না) করতে পারেন তবে বিকল্প বিকল্প রয়েছে। আপনি জাভা অ্যাপ্লিকেশনটি আপনার জন্য থ্রেড ডাম্প মুদ্রণ করতে পারেন। স্ট্যাক ট্রেস সংগ্রহ করে এমন কোড যুক্তিসঙ্গত সহজ এবং এটি একটি বোতাম বা ওয়েব ইন্টারফেসের সাথে সংযুক্ত থাকতে পারে।

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

নিম্নলিখিত স্ক্রিপ্টটি অন্য উইন্ডোজ সেশনে সংযোগ করতে 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 পিআইডি থ্রেড.প্রিন্ট> থ্রেড.ডাম্প

রেফারেন্স লিঙ্ক

আপনি থ্রেড ডাম্প পেতে jstack ব্যবহার করতে পারেন (jstack পিআইডি> থ্রেড.ডাম্প)। রেফারেন্স লিঙ্ক

কীভাবে হিপ ডাম্প পাবেন?

হিপ ডাম্প পেতে jmap সরঞ্জাম ব্যবহার করুন। jmap -F -dump: লাইভ, ফর্ম্যাট = বি, ফাইল = হিপ.বিন পিআইডি

পিআইডি মানে অ্যাপ্লিকেশনটির প্রসেস আইডি। রেফারেন্স লিঙ্ক


1

জে সিএমডি হতে পারে ?

জে সিএমডি ইউটিলিটি ডায়াগনস্টিক কমান্ড অনুরোধগুলি জেভিএম-তে প্রেরণের জন্য ব্যবহৃত হয়, যেখানে জাভা ফ্লাইট রেকর্ডিং নিয়ন্ত্রণ, সমস্যা সমাধান এবং জেভিএম এবং জাভা অ্যাপ্লিকেশনগুলি নির্ণয়ের জন্য এই অনুরোধগুলি কার্যকর।

জেসিএমডি সরঞ্জামটি ওরাকলের জাভা 7-এর সাথে প্রবর্তিত হয়েছিল এবং জাভা প্রসেসের আইডি (জেপিএস-এর অনুরূপ) সনাক্ত করতে, হিপ ডাম্প (জ্যাম্যাপের অনুরূপ) সনাক্তকরণ, থ্রেড ডাম্প (জেস্টকের অনুরূপ) অর্জন করে জেভিএম অ্যাপ্লিকেশনগুলির সাথে সমস্যা সমাধানের ক্ষেত্রে বিশেষভাবে কার্যকর ), ভার্চুয়াল মেশিন বৈশিষ্ট্য যেমন সিস্টেমের বৈশিষ্ট্য এবং কমান্ড-লাইন পতাকাগুলি (জিনফোর অনুরূপ) দেখা এবং আবর্জনা সংগ্রহের পরিসংখ্যান (জাস্টের অনুরূপ) অর্জন করা। জিসিএমডি সরঞ্জামটিকে "আপনার জেভিএম অ্যাপ্লিকেশন দিয়ে সমস্যাগুলি অনুসন্ধান এবং সমাধানের জন্য একটি সুইস-আর্মি ছুরি" এবং একটি "লুকানো রত্ন" বলা হয়েছে।

এখানে অনুরোধ করার সময় আপনার প্রক্রিয়াটি প্রয়োজন jcmd:

  1. যাও jcmd <pid> GC.heap_dump <file-path>
  2. যা
  3. পিড: একটি জাভা প্রসেস আইডি, যার জন্য হিপ ডাম্প ধরা পড়বে এছাড়াও, the
  4. ফাইল-পাথ: একটি ফাইল পাথ যা হিপ ডাম্প মুদ্রিত হয়।

জাভা হ্যাপ ডাম্প নেওয়া সম্পর্কে আরও তথ্যের জন্য এটি পরীক্ষা করে দেখুন ।


0

ভিজ্যুভ্যালভ ফলোআপ:

আপনি যদি jvisualvm থেকে আপনার চলমান JVM- এর সাথে "সংযোগ স্থাপন করতে না পারেন" কারণ আপনি এটি সঠিক JVM যুক্তি (এবং এটি রিমোট বাক্সে) দিয়ে শুরু করেননি jstatd, তাহলে রিমোট বাক্সে চালান , তারপরে, ধরে নিন যে আপনার সরাসরি সংযোগ রয়েছে, যোগ করুন এটি ভিজ্যুভিএলে একটি "রিমোট হোস্ট" হিসাবে, হোস্টের নামটিতে ডাবল ক্লিক করুন এবং সেই বাক্সে থাকা অন্য সমস্ত জেভিএম ভিজ্যুয়ালভিমে যাদুতে প্রদর্শিত হবে।

যদি সেই বাক্সটিতে পোর্টগুলির সাথে "সরাসরি সংযোগ" না থাকে তবে আপনি প্রক্সি দিয়েও এটি করতে পারেন ।

আপনি যে প্রক্রিয়াটি চান তা একবার দেখতে পেলে jvisualvm এ ড্রিল করুন এবং মনিটরের ট্যাব -> "হ্যাপডাম্প" বোতামটি ব্যবহার করুন।


0

জাভা কোডের নীচে পিআইডি সরবরাহ করে জাভা প্রক্রিয়াটির হিপ ডাম্প পেতে ব্যবহার করা হয়। প্রোগ্রামটি হিপ ডাম্প করতে রিমোট জেএমএক্স সংযোগ ব্যবহার করে। এটি কারওর জন্য সহায়ক হতে পারে।

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 আপনি উইন্ডোজ মেশিনে চলমান সমস্ত জাভা প্রক্রিয়া আইডি পেতে সক্ষম হবেন। এই তালিকা থেকে আপনাকে চাইল্ড প্রক্রিয়া আইডি নির্বাচন করতে হবে। আপনার চাইল্ড প্রসেস আইডির পরে, থ্রেড ডাম্প এবং হিপ ডাম্পগুলি ক্যাপচার করার জন্য বিভিন্ন বিকল্প রয়েছে।

থ্রেড ডাম্প ক্যাপচারিং:

থ্রেড ডাম্পগুলি ক্যাপচারের জন্য 8 টি বিকল্প রয়েছে:

  1. jstack
  2. হত্যা -3
  3. jvisualVM
  4. JMC
  5. উইন্ডোজ (Ctrl + ব্রেক)
  6. ThreadMXBean
  7. এপিএম সরঞ্জামসমূহ
  8. jcmd

প্রতিটি বিকল্প সম্পর্কে বিশদ এই নিবন্ধে পাওয়া যাবে । একবার আপনার থ্রেড ডাম্পগুলি ক্যাপচার হয়ে গেলে, আপনি ফাস্টথ্রেড , সামুরিটো থ্রেড ডাম্পগুলির বিশ্লেষণের মতো সরঞ্জাম ব্যবহার করতে পারেন ।

হিপ ডাম্প ক্যাপচারিং:

হিপ ডাম্পগুলি ক্যাপচারের জন্য 7 টি বিকল্প রয়েছে:

  1. jmap

  2. -XX + HeapDumpOnOutOfMemoryError

  3. jcmd

  4. JVisualVM

  5. JMX

  6. প্রোগ্রাম্যাটিক অ্যাপ্রোচ

  7. প্রশাসনিক কনসোলগুলি

প্রতিটি বিকল্প সম্পর্কে বিশদ এই নিবন্ধে পাওয়া যাবে । একবার আপনি হিপ ডাম্প ক্যাপচার করে নিলে, আপনি বন্দী হিপ ডাম্পগুলি বিশ্লেষণের জন্য এক্লিপস মেমোরি বিশ্লেষণ সরঞ্জাম , হিপহিরোর মতো সরঞ্জাম ব্যবহার করতে পারেন ।


-1

একটি ওরাকল জেডিকেতে, আমাদের কাছে একটি কমান্ড রয়েছে যম্যাপ (জাভা হোমের বিন ফোল্ডারে পাওয়া যায়)। কমান্ডের ব্যবহার নীচে আসে

jmap (বিকল্প) (পিড)

উদাহরণ: জ্যাম্যাপ -ডাম্প: লাইভ, ফর্ম্যাট = বি, ফাইল = হিপ.বিন (পিড)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.