zoukankan      html  css  js  c++  java
  • 实战Java虚拟机之二“虚拟机的工作模式”

    今天开始实战Java虚拟机之二:“虚拟机的工作模式”。

    总计有5个系列

       目前的Java虚拟机支持Client和Server两种运行模式。使用参数-client可以指定使用Client模式,使用参数-server可以指定使用Server模式。默认情况下,虚拟机会根据当前计算机系统环境自动选择运行模式。使用-version参数可以查看当前的模式,如下所示:

    1. ./java -version  
    2. java version "1.7.0_40"  
    3. Java(TM) SE Runtime Environment (build1.7.0_40-b43)  
    4. Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode, sharing)  

    使用-server参数后,就可以得到如下输出:

    1. ./java -server -version  
    2. java version "1.7.0_40"  
    3. Java(TM) SE Runtime Environment (build1.7.0_40-b43)  
    4. Java HotSpot(TM) Server VM (build 24.0-b56, mixed mode)  


        与Client模式相比,Server模式的启动比较慢,因为Server模式会尝试收集更多的系统性能信息,使用更复杂的优化算法对程序进行优化。因此,当系统完全启动并进入运行稳定期后,Server模式的执行速度会远远快于Client模式。所以,对于后台长期运行的系统,使用-server参数启动对系统的整体性能可以有不小的帮助。但对于用户界面程序,运行时间不长,又追求启动速度,Client模式也是不错的选择。

    从发展趋势上看,未来64位系统必然会逐步取代32位系统,而在64位系统中虚拟机更倾向于Server模式运行。

       虚拟机在Server模式和Client模式下的各种参数可能会有很大不同,读者如果需要查看给定参数的默认值,可以使用-XX:+PrintFlagsFinal参数。这里以JIT编译阈值和最大堆为例,展示Client模式和Server模式下两者的区别。

    对于Client模式,参数如下: 

    1. ./java -XX:+PrintFlagsFinal -client -version  |grep -E ' CompileThreshold| MaxHeapSize'  
    2.      intx CompileThreshold                          = 1500            {pd product}  
    3.     uintx MaxHeapSize                              := 268435456       {product}  
    4. java version "1.7.0_40"  
    5. Java(TM) SE Runtime Environment (build1.7.0_40-b43)  
    6. Java HotSpot(TM) Client VM (build 24.0-b56, mixedmode, sharing)  

    对于Server模式,参数如下:

    1. ./java -XX:+PrintFlagsFinal -server -version  |grep -E ' CompileThreshold| MaxHeapSize'  
    2.      intx CompileThreshold                          = 10000           {pd product}  
    3.     uintx MaxHeapSize                              :=1073741824      {product}  
    4. java version "1.7.0_40"  
    5. Java(TM) SE Runtime Environment (build1.7.0_40-b43)  
    6. 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。对于其他参数,读者可以使用类似的方式进行查找比较。

    • 实战Java虚拟机之一“堆溢出处理”
    • 实战Java虚拟机之二“虚拟机的工作模式”
    • 实战Java虚拟机之三“G1的新生代GC”
    • 实战Java虚拟机之四“禁用System.gc()”
    • 实战Java虚拟机之五“开启JIT编译”
    节选自

    《实战Java虚拟机》一书Q交流群:397196583

  • 相关阅读:
    10-tensorflow-tf.concat()
    09-tensorflow-tf.split()
    10-numpy笔记-np.random.randint
    学习网络编程的一些实用技巧和细节
    读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第一部分) 重新学习了 继续学习第二 三部分更加精彩
    对四次挥手中的TIME_WAIT状态的学习
    accept 和 connect API深入 重点accept阻塞和非阻塞问题学习
    几种IO情况的学习和总结 关于 =====阻塞/非阻塞以及同步/异步区别
    tcp头和ip头 图文简介和简要说明
    Nginx 为什么要延迟关闭
  • 原文地址:https://www.cnblogs.com/love-jishu/p/4402156.html
Copyright © 2011-2022 走看看