这里向大家描述一下JVM client模式和Server模式两者的区别和联系,JVM如果不显式指定是-Server模式还是-client模式,JVM能够根据下列原则进行自动判断(适用于Java5版本或者Java以上版本)。
JVM client模式和Server模式
JVM Server模式与client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升。JVM如果不显式指定是-Server模式还是-client模式,JVM能够根据下列原则进行自动判断(适用于Java5版本或者Java以上版本)。
前段时间有个同事给我发了个java跟c++性能比较的文章,其中有个对比图引起了我的兴趣,意外的是,我感兴趣的不是java和c++的对比,而是java -Server模式和java -client模式的对比。从来没想到两者间的性能有如此巨大的差别。而在后来自己的亲身测试中发现确实如此。
下面是我看到的那个对比图:
图中最显著的就是JVM client模式和Server模式关于method call的对比,那个差别不是一般的大,在后来的测试中发现,相差至少有10倍。
下面是另外两个对比图:
JVM工作在Server模式可以大大提高性能,但应用的启动会比client模式慢大概10%。当该参数不指定时,虚拟机启动检测主机是否为服务器,如果是,则以Server模式启动,否则以client模式启动,J2SE5.0检测的根据是至少2个CPU和最低2GB内存。
当JVM用于启动GUI界面的交互应用时适合于使用client模式,当JVM用于运行服务器后台程序时建议用Server模式。
JVM在client模式默认-Xms是1M,-Xmx是64M;JVM在Server模式默认-Xms是128M,-Xmx是1024M。我们可以通过运行:java -version来查看jvm默认工作在什么模式。
仅是指定服务器启动时初始化的参数值,这些默认值影响运行时的性能。
普通 PC 就工作在 client 模式就好了,特别是你的内存不是很大时不需要 server 模式,因为 server 模式是为服务器准备的,它的意思就是说这个服务器启动之后基本上不做别的,所以可以把所有内存都尽量给 JVM 使用,所以才能得到一个更好的性能。
但是 PC 机的话,因为我们频繁地在多个程序切换,每次把程序带到前台窗口或退到后台窗口都会导致 Windows 操作系统在物理内存和硬盘上的虚拟内存之间切换,这影响性能。一个常见的事情就是我们开着多个程序,并且把 Java 程序切换到最小化,另一个非 Java 程序最大化,然后我们出门吃饭 2 小时后回来把 Java 程序最大化,你会发现这个时候切换到最大化可能需要 15分钟的时间,这就是内存紧张时虚拟内存和物理内存间交换数据时导致 JVM 频繁地触发垃圾收集(GC)导致的性能问题。而这个现象在 server 模式不会出现,因为它是假设服务器专用的,而且基本上没有前台程序,都是后台程序。
JVM 并不能预测什么时候是数据从虚拟内存搬到物理内存,什么时候内存紧张又是从物理内存搬到虚拟内存,因为这是操作系统的事情,它不会让应用程序知道这件事。反正JVM在这种情况下频繁地触发"完全的“垃圾收集就导致性能问题。