问题 如何判断VM是在服务器端还是客户端模式下运行?


Java热点vpm可以使用-client或-server参数运行。如果两者都没有指定,则根据某些规则选择一个。

在命令行中未指定模式时,是否可以判断正在运行的VM是以客户端还是服务器模式运行?我在运行过程之外的Windows机器上需要这个。

我意识到这不是一个编程问题,但我希望它没关系,因为它与编程相关。提前致谢。


3349
2017-08-21 11:00


起源

刚刚添加了jinfo possiblity - VonC
@Hemal因此我的用法 jinfo,严格限于 -flag 选项:它的工作原理 - VonC


答案:


在Java中,您可以使用以下代码进行检查:

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

但这将是高度针对特定供应商的。

从命令行,您可以使用 金佛山 (曾经 检查给定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很少见 火锅选项 和
  • 文档规定:新旧一代尺寸的比例。 [x86 -server: 8; x86 -client: 12]

12表示“客户”。


4
2017-08-21 11:08



我确实需要在命令行上使用它,但遗憾的是jinfo不支持Windows,这是我需要的地方。 - Miserable Variable
返回字符串是特定于供应商的,但整个客户端与服务器VM问题也是特定于供应商的。 - beetstra
@Hemal:如果你可以复制JDK6,你可以在Windows上调用jinfo - VonC
@VonC:我使用的是JDK6,但在Windows上,jinfo只支持正在运行的进程的-flag选项。 java.sun.com/javase/6/docs/technotes/tools/share/... - Miserable Variable
@Hemal因此我对jinfo的使用,严格限于-flag:它的工作原理 - VonC


使用连接到正在运行的Java进程 jvisualvm。这将让您看到已使用的JVM参数。


5
2017-08-21 11:32





您可以检索连接到MBean服务器的此信息。如果您运行的是Sun VM,则会有一个名为“java.lang:type = Runtime”的MBean,它公开属性“VmName”,其值与系统属性“java.vm.name”相同。例如,对于服务器vm,该值将类似于“Java HotSpot(TM)Server VM”。来自其他供应商的VM可能使用类似的机制。

您可以使用JDK中包含的工具(如jconsole或jvisualvm)连接到MBean服务器,也可以使用自己的工具编写 JMX 如果您需要编程访问。


2
2017-08-21 11:52





如果使用-debug启动jvm,则可以使用jdb连接到它,并使用eval ...

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

那或 金佛山


0
2017-08-21 11:35