Отображение имени основного класса каждой доступной JVM, например VisualVM - PullRequest
3 голосов
/ 23 апреля 2011

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 ]

6 голосов
/ 24 апреля 2011

После просмотра источника 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 голос
/ 24 апреля 2011

откройте командную строку и введите: jps -lm

. Здесь будут показаны все процессы Java, работающие с текущей JVM в вашей переменной PATH, со следующей информацией:

  • MainClass
  • передано аргументов
  • идентификатор процесса
...