JVM 的 Client Mode 与 Server Mode

目前正在读“深入理解 Java 虚拟机 – JVM 高级特性与最佳实践”,这本书确实是国内少见的好书之一,虽然个人感觉也有一些不恰当的地方。例如第3章介绍 GC 策略时,一直没有简单解释一下”新生代 (Young generation)” 和”老年代 (Tenured generation)” 这两个概念。我也是在这书中才发现 HotSpot VM 有两个模式 – Server Mode 与 Client Mode,作者也没有介绍。也许是因为这些话题比较初级吧。

关于这两个模式的区别,这个 FAQ 里有介绍。简单地说,Client Mode 启动快,Server Mode 整体性能好。它们使用了不同的 JIT 编译器,Server VM 使用的那一个对代码做了更加多的优化。一般来说,像 Tomcat 这样的 Servlet container 需要长时间运行,启动速度相对来说不是那么的敏感,适合运行在 Server VM 里。而 GUI 程序对启动速度要求比较高,所以使用 Client VM 较好。

它还提到 “Some of the other differences include the compilation policy,heap defaults, and inlining policy.” 当然按“深入理解 Java 虚拟机” 书中65页的表格,它们使用的 GC 策略也不一样。

如何指定使用哪个 VM 呢?启动的时候指定 -client 或者 -server 参数即可。如果不写参数默认是哪个?官方说法是自动探测 “server class”. 该网页介绍,如果当前机器有两个或以上 CPU,并且有2GB以上内存,那么就认为这个机器是 server-class machine, 默认就会运行 Server VM. 说实话,这个 server class 的标准还挺低的,现在大多数个人笔记本电脑也都达到 server class 的要求了!

如何知道某个 VM 进程在哪个模式运行?有几种办法。第一种是在程序自己里面输出:

public class VMMode {
    public static void main(String[] args) throws InterruptedException {
        System.out.println(System.getProperty("java.vm.name"));
    }
}

分别尝试不同的命令行参数:

$ java -client VMMode
Java HotSpot(TM) Client VM
$ java -server VMMode 
Java HotSpot(TM) Server VM
$ java VMMode 
Java HotSpot(TM) Client VM

刚才说到大多数个人电脑都达到 server class 标准了,可怜我的破电脑还是单核,1G内存 🙂 所以默认是 Client VM.

第二种办法是对于一个运行中的 VM 进程,可以通过 jps 先获取其 pid,然后用 jinfo 获取系统属性:

jinfo -sysprops 20417

结果中有一行是

java.vm.name = Java HotSpot(TM) Client VM

也可以通过图形界面的工具,例如 JDK 自带的 jvisualvm 来看这个属性。

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.