Как определить, работает ли VM в режиме сервера или клиента?

Java hotspot vpm может быть запущен с аргументом -client или -server. Если ни один из них не указан, он выбирает один в соответствии с некоторыми правилами.

Можно ли указать, работает ли работающая виртуальная машина в режиме клиента или сервера, когда режим не указан в командной строке? Мне нужно это в окне Windows вне рабочего процесса.

Я понимаю, что это не вопрос программирования, но я надеюсь, что это нормально, потому что это связано с программированием. Спасибо заранее.

Ответ 1

В Java вы можете проверить это с помощью этого кода:

String s = System.getProperty("java.vm.name");
// s = Java HotSpot(TM) Server VM

Но это будет очень специфичным для вендора.

В командной строке вы можете использовать jinfo (используется для проверить значение данной опции HotSpot VM)

C:\>"c:\Program Files\Java\jdk1.6.0_16\bin\jps.exe" -l -m
21812 sun.tools.jps.Jps -l -m
19244 (eclipse)

C:\>"c:\Program Files\Java\jdk1.6.0_16\bin\jinfo.exe" -flag NewRatio 19244
-XX:NewRatio=12

С

  • редко можно установить параметр Newratio Hotpot и
  • В документации указано: отношение размеров нового/старого поколения. [x86 -server: 8; x86 -client: 12]

12 означает "Клиент".

Ответ 2

Подключитесь к запущенному процессу Java с помощью jvisualvm. Это позволит вам увидеть аргументы JVM, которые были использованы.

Ответ 3

Вы можете получить эту информацию, подключившись к серверу MBean. Если вы используете Sun VM, у вас есть MBean с именем "java.lang: type = Runtime", который предоставляет атрибут "VmName", значение которого совпадает с системным свойством "java.vm.name". В примере, для сервера vm значение будет чем-то вроде "Java HotSpot (TM) Server VM". VM от других поставщиков может использовать аналогичный механизм.

Вы можете подключиться к серверу MBean либо с помощью инструментов, включенных в JDK, например, jconsole или jvisualvm, либо путем написания собственного инструмента с помощью JMX, если вам нужен программный доступ.

Ответ 4

Если jvm запущен с -debug, вы можете подключиться к нему с помощью jdb и использовать eval...

eval System.getProperty("java.vm.name");

что или jinfo