VisualVM做得非常好,每个完整的主类名都显示在左侧栏导航中.这些名字是如何检索的? Attach API为所有正在运行的JVM提供显示名称,但是,某些显示名称看起来有点膨胀,例如
Eclipse:
C:\Program Files\Eclipse\plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar -os win32 -ws win32 -arch x86_64 -showsplash -launcher C:\Program Files\Eclipse\eclipse.exe -name Eclipse --launcher.library C:\Program Files\Eclipse\plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.1.R36x_v20100810\eclipse_1309.dll -startup C:\Program Files\Eclipse\plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar -exitdata 1084_58 -product org.eclipse.epp.package.jee.product -vm C:\Windows\system32\javaw.exe -vmargs -Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m -XX:MaxPermSize=256m -jar C:\Program Files\Eclipse\plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
VisualVM缩短它的位置:org.eclipse.equinox.launcher.Main
他们如何检索它?从当前的JVM中可以轻松获取所有线程的主类.
解决方法
在查看VisualVM源代码后,它会执行以下操作:
MonitoredHost monitoredHost = MonitoredHost.getMonitoredHost("//localhost"); List<MonitoredVm> monitoredVms = new ArrayList<MonitoredVm>(); Set<Integer> vms = monitoredHost.activeVms(); for (Integer vm : vms) { monitoredVms.add(monitoredHost.getMonitoredVm(new VmIdentifier(vm.toString()))); } for (MonitoredVm monitoredVm : monitoredVms) { System.out.println(MonitoredVmUtil.commandLine(monitoredVm)) }