jstack -F -l pid は (作業ディレクトリが JAVA_HOME であると仮定) と同様です。
bin/java -Dsun.jvm.hotspot.debugger.useWindbgDebugger -Dsun.jvm.hotspot.debugger.useProcDebugger -cp lib/sa-jdi.jar;lib/tools.jar sun.tools.jstack.JStack -F -l pid
およびsun.tools.jstack.JStack コード内
if (arg.equals("-F")) {
useSA = true;
}
.....
// now execute using the SA JStack tool or the built-in thread dumper
if (useSA) {
// parameters (<pid> or <exe> <core>
...
runJStackTool(mixed, locks, params);
} else {
// pass -l to thread dump operation to get extra lock info
String pid = args[optionCount];
...
runThreadDump(pid, params);
}
-F が渡されるため、runJStackTool が呼び出されて、sun.jvm.hotspot.tools.JStack がロードされます。直接呼び出すのと同じ効果があります。
bin\java -Dsun.jvm.hotspot.debugger.useWindbgDebugger -Dsun.jvm.hotspot.debugger.useProcDebugger -cp lib/sa-jdi.jar;lib/tools.jar sun.jvm.hotspot.tools.JStack pid
そして、sun.jvm.hotspot.tools.JStack は、sun.jvm.hotspot.bugspot.BugSpotAgent を呼び出しますattach -> go ->setupVM メソッド
多分以下のコードは魔法です
jvmdi = new ServiceabilityAgentJVMDIModule(debugger, saLibNames);
if (jvmdi.canAttach()) {
jvmdi.attach();
jvmdi.setCommandTimeout(6000);
debugPrintln("Attached to Serviceability Agent's JVMDI module.");
// Jog VM to suspended point with JVMDI module
resume();
suspendJava();
suspend();
debugPrintln("Suspended all Java threads.");
}
ターゲット プロセスのすべての Java スレッドを中断します。アプリケーションがスレッド スタベーションのためにハングしている場合、suspend メソッドの呼び出しによってスレッドが緩和されることがあります。