显示可用的每个JVM的主类名称,如VisualVM

时间:2011-04-23 19:27:37

标签: java jvisualvm

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中,它很容易获得所有线程的主要类。

2 个答案:

答案 0 :(得分:6)

在查看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))
}

答案 1 :(得分:1)

打开命令提示符并输入:jps -lm

这将显示PATH中当前JVM运行的所有java进程,并提供以下信息:

  • MainClass
  • args传递
  • 进程ID