#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 ()