摘要:今天开始实战虚拟机之二虚拟机的工作模式。总计有个系列实战虚拟机之一堆溢出处理实战虚拟机之二虚拟机的工作模式实战虚拟机之三的新生代实战虚拟机之四禁用实战虚拟机之五开启编译目前的虚拟机支持和两种运行模式。
今天开始实战Java虚拟机之二:“虚拟机的工作模式”。
总计有5个系列
实战Java虚拟机之一“堆溢出处理”
实战Java虚拟机之二“虚拟机的工作模式”
实战Java虚拟机之三“G1的新生代GC”
实战Java虚拟机之四“禁用System.gc()”
实战Java虚拟机之五“开启JIT编译”
目前的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)
与Client模式相比,Server模式的启动比较慢,因为Server模式会尝试收集更多的系统性能信息,使用更复杂的优化算法对程序进行优化。因此,当系统完全启动并进入运行稳定期后,Server模式的执行速度会远远快于Client模式。所以,对于后台长期运行的系统,使用-server参数启动对系统的整体性能可以有不小的帮助。但对于用户界面程序,运行时间不长,又追求启动速度,Client模式也是不错的选择。
从发展趋势上看,未来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。对于其他参数,读者可以使用类似的方式进行查找比较。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64327.html
摘要:今天开始实战虚拟机之三的新生代。一旦区被占满,新生代就会启动。新生代收集前后的堆数据如图所示,其中表示区,表示区,表示老年代。当然我们最为关心的依然是的停顿时间以及回收情况。节选自实战虚拟机一书交流群 今天开始实战Java虚拟机之三:G1的新生代GC。 总计有5个系列实战Java虚拟机之一堆溢出处理实战Java虚拟机之二虚拟机的工作模式实战Java虚拟机之三G1的新生代GC实战Java...
摘要:如下文字显示了典型的堆内存溢出一旦发生这类问题,系统就会被迫退出。有关等工具的使用,可以参阅实战虚拟机故障诊断与性能优化第章。除了在发生时可以导出堆信息外,虚拟机还允许在发生错误时执行一个脚本文件。 从今天开始,我会发5个关于java虚拟机的小系列:实战Java虚拟机之一堆溢出处理 [实战Java虚拟机之二虚拟机的工作模式][2] [实战Java虚拟机之三G1的新生代GC][3] 实战...
摘要:监控和故障处理工具显示指定系统内所有的虚拟机进程用于收集虚拟机各方面的运行数据。的常用功能选项测试上面输出了我正在运行程序的包名下的类名虚拟机统计信息监视工具使用于监视虚拟机各种运行状态信息的命令行工具。 《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版》读书笔记与常见面试题总结 本节常见面试题(推荐带着问题阅读,问题答案在文中都有提到): JVM调优的常见命令行工具有哪些?...
摘要:运行时数据区域虚拟机在执行程序的过程中会把它管理的内存划分成若干个不同的数据区域。堆虚拟机所管理的内存中最大的一块,堆是所有线程共享的一块内存区域,在虚拟机启动时创建。 《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版》读书笔记 1 概述 对于Java程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个new 操作去写对应的delete/...
摘要:深入理解虚拟机高级特性与最佳实践第二版读书笔记与常见面试题总结本节常见面试题介绍下内存区域运行时数据区。运行时数据区域虚拟机在执行程序的过程中会把它管理的内存划分成若干个不同的数据区域。 《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版》读书笔记与常见面试题总结 本节常见面试题: 介绍下Java内存区域(运行时数据区)。 对象的访问定位的两种方式。 1 概述 对于Java...
阅读 1394·2023-04-26 01:58
阅读 2227·2021-11-04 16:04
阅读 1734·2021-08-31 09:42
阅读 1722·2021-07-25 21:37
阅读 1048·2019-08-30 15:54
阅读 2043·2019-08-30 15:53
阅读 3028·2019-08-29 13:28
阅读 2665·2019-08-29 10:56