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
и в солнце .tools.jstack.JStack code
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 может их расслабить.
person
Ted Shaw
schedule
29.08.2012