jvm server模式与client模式启动,最主要的差别在于:-server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升。
jvm工作在server模式下可以大大提高性能,server模式下应用的启动速度会比client模式慢大概10%,但运行速度比client vm要快至少有10倍
当不指定运行模式参数时,虚拟机启动检测主机是否为服务器,如果是,则以server模式启动,否则以client模式启动,j2se5.0检测的根据是至少2个cpu和最低2gb内存
由于服务器的cpu、内存和硬盘都比客户端机器强大,所以程序部署后,都应该以server模式启动,获取较好的性能;
jvm在client模式默认-xms是1m,-xmx是64m;jvm在server模式默认-xms是128m,-xmx是1024m;
server:启动慢,编译更完全,编译器是自适应编译器,效率高,针对服务端应用优化,在服务器环境中最大化程序执行速度而设计。
client:快速启动,内存占用少,编译快,针对桌面应用程序优化,为在客户端环境中减少启动时间而优化;
当jvm用于启动gui界面的交互应用时适合于使用client模式,当jvm用于运行服务器后台程序时建议用server模式。
我们可以通过运行:java -version来查看jvm默认工作在什么模式。
关于图一中的gcc
clien模式下,新生代选择的是串行gc,旧生代选择的是串行gc
server模式下,新生代选择的是并行回收gc,旧生代选择的是并行gc
一般来说我们系统应用选择有两种方式:吞吐量优先和暂停时间优先,对于吞吐量优先的采用server默认的并行gc方式,对于暂停时间优先的选用并发gc(cms)方式。
其它延伸知识点
jdk有两种vm,vm客户端,vm服务器应用程序。这两种解决方案分享java运行环境的热点代码库,但使用不同的编译器,适用于客户机和服务器的独特的性能特点,这些差异包括编写内联政策和堆的默认值。
虽然服务器和客户端虚拟机类似,服务器vm已专门调整最大峰值操作速度。它的目的是执行长时间运行的服务器应用程序,它需要最快的运行速度超过一个快速启动时间或较小的运行时内存占用。
客户vm编译器是经典的虚拟机和实时升级(jit)通过jdk的先前版本使用的编译器。客户端虚拟机提供了改进的运行应用程序和小程序的性能。java虚拟机的热点客户已减少应用程序的启动时间和内存占用特别调整,使其特别适合客户环境。在一般情况下,客户端系统更好的图形用户界面。
因此,真正的区别也在编译器级别上:
客户端虚拟机编译器不尝试执行由编译器在服务器虚拟机上执行的更复杂的优化,但在交换过程中,它需要较少的时间来分析和编译一段代码。这意味着客户端虚拟机可以更快地启动,并需要一个较小的内存占用。
服务器虚拟机包含一个先进的自适应编译器支持许多c++编译器的优化进行优化,同样的类型,以及一些优化,不能用传统的编译器完成的,比如积极的内联在虚拟方法调用。这是一个竞争和性能优势,静态编译器。自适应优化技术在它的方法是非常灵活的,通常优于甚至先进的静态分析和编译技术。
-server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升,原因是:当虚拟机在-client模式的时候,使用的是一个代号为c1的轻量级编译器,而-server模式启动的虚拟机采用相对重量级代号为c2的编译器,c2比c1编译器编译的相对彻底,服务起来之后,性能高。
一般只要变更-server known与-client known两个配置的先后顺序即可,前提是java_home/jre/bin目录下同时存在server和client两个文件夹,分别对应各自的jvm
说了这么多其实总结成一句话就是:
jvm server模式下应用启动慢但运行速度快,jvm client模式下应用启动快但运行速度要慢些
推荐:服务器上请以server模式运行,面客户端或gui模式下就以client模式运行