今天开始实战Java虚拟机之二:“虚拟机的工作模式”。
总计有5个系列
目前的Java虚拟机支持Client和Server两种运行模式。使用参数-client可以指定使用Client模式,使用参数-server可以指定使用Server模式。默认情况下,虚拟机会根据当前计算机系统环境自动选择运行模式。使用-version参数可以查看当前的模式,如下所示:
./java -version java version "1.7.0_40" Java(TM) SE Runtime Environment (build1.7.0_40-b43) Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode, sharing)
使用-server参数后,就可以得到如下输出:
./java -server -version java version "1.7.0_40" Java(TM) SE Runtime Environment (build1.7.0_40-b43) Java HotSpot(TM) Server VM (build 24.0-b56, mixed mode)
从发展趋势上看,未来64位系统必然会逐步取代32位系统,而在64位系统中虚拟机更倾向于Server模式运行。
虚拟机在Server模式和Client模式下的各种参数可能会有很大不同,读者如果需要查看给定参数的默认值,可以使用-XX:+PrintFlagsFinal参数。这里以JIT编译阈值和最大堆为例,展示Client模式和Server模式下两者的区别。
对于Client模式,参数如下:
./java -XX:+PrintFlagsFinal -client -version |grep -E ' CompileThreshold| MaxHeapSize' intx CompileThreshold = 1500 {pd product} uintx MaxHeapSize := 268435456 {product} java version "1.7.0_40" Java(TM) SE Runtime Environment (build1.7.0_40-b43) Java HotSpot(TM) Client VM (build 24.0-b56, mixedmode, sharing)对于Server模式,参数如下:
./java -XX:+PrintFlagsFinal -server -version |grep -E ' CompileThreshold| MaxHeapSize' intx CompileThreshold = 10000 {pd product} uintx MaxHeapSize :=1073741824 {product} java version "1.7.0_40" Java(TM) SE Runtime Environment (build1.7.0_40-b43) Java HotSpot(TM) Server VM (build 24.0-b56, mixedmode)
可以看到,在Client模式下,CompileThreshold默认值为1500,即函数被调用1500次后,会进行JIT编译(有关JIT编译的更多细节请参阅《实战Java虚拟机-jvm故障诊断与性能优化》第11章)。而在Server模式下,这个数值为10000。因此,Server模式下系统更有可能解释执行。而一旦进行编译,Server模式的优化效果会好于Client模式。其次,对于系统最大堆,在Client模式下为约256M,而在Server模式下约为1G。对于其他参数,读者可以使用类似的方式进行查找比较。
原文地址:http://blog.csdn.net/xinaij/article/details/44938107