Отображать имя основного класса каждой доступной JVM, например VisualVM

#java #jvisualvm

#java #jvisualvm

Вопрос:

VisualVM делает это действительно красиво, каждое полное имя основного класса отображается в левой боковой панели навигации. Как извлекаются эти имена? Attach API предлагает все запущенные JVM с отображаемым именем, однако некоторые отображаемые имена кажутся немного раздутыми, например Eclipse:

 C:Program FilesEclipseplugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar -os win32 -ws win32 -arch x86_64 -showsplash -launcher C:Program FilesEclipseeclipse.exe -name Eclipse --launcher.library C:Program FilesEclipseplugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.1.R36x_v20100810eclipse_1309.dll -startup C:Program FilesEclipseplugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar -exitdata 1084_58 -product org.eclipse.epp.package.jee.product -vm C:Windowssystem32javaw.exe -vmargs -Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m -XX:MaxPermSize=256m -jar C:Program FilesEclipseplugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
  

Где VisualVM сокращает его с: org.eclipse.equinox.launcher.Main

Как они его извлекают? Из текущей JVM легко получить все основные классы потоков.

Ответ №1:

После просмотра исходного кода 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. Вау, спасибо — я не знал, что код открыт, но, конечно.

Ответ №2:

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

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

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

Комментарии:

1. Это точно такой же результат, который я получаю с помощью прикрепленного API DisplayName ()