java -version 命令大家都用过,大部分就是看下jdk版本或检查下环境变量的设置,但最后一行的信息也挺重要,如下图所示:
Server VM表示我们的虚拟机类型,mixed mode表示虚拟机以混合模式工作。
一. 虚拟机
先说下本篇文章的内容都是基于HotSpot虚拟机。
我们熟知的Java虚拟机是一种规范标准,有多种实现,比如HotSpot虚拟机就是JVM的一种实现,也是目前使用范围最广的Java虚拟机。其实HotSpot最早也不是Sun开发的,是他早期收购的一家公司开发的,后来Sun把JDK开源后,OpenJDK诞生了,所以HotSpot成了这两个JDK共用的虚拟机。
除了HotSpot虚拟机,Oracle原来的JRockit VM也是Java虚拟机的实现(后面会把HotSpot和JRockit整合),还有IBM也有对应的VM实现。
为什么叫HotSpot虚拟机?
如同它的名字,它的特点就是热点代码探测技术,这个技术可以通过执行计数器找出最具有编译价值的代码,然后通过JIT即时编译成机器码并缓存起来,提高执行效率。
而JIT编译只是一种概念,HotSpot内置C1,C2这两种编译器实现:
C1:编译时间短,优化策略简单C2:编译时间长,优化策略复杂
C1,C2都属于JIT编译技术,是JIT的不同实现
二. 虚拟机类型client server的区别
HotSpot虚拟机分client端和server端,准确的说应该是分两种类型,因为client,server VM是两种适用不同业务场景的虚拟机类型。
在第一张图中圈出的Server VM使用的就是C2编译器。
所以clientserver最大的区别就是C1和C2的区别,主要体现在编译策略上:
大家可以根据具体的业务场景选择,不过现在的系统大部分都是B/S架构,前后端又是分离的,所以我们用的虚拟机大部分都是server类型。
网上有张c++和java的性能对比,如下:
可以看到最明显的差异是JVM client端和server端关于method call方法调用上的性能对比(红色是server VM,黄色是client VM,越高越好)。
另外client/server VM除了在编译策略和性能上的区别外,在内存分配和GC上也不一样:
如果需要修改HotSpot虚拟机的类型可以通过%JAVA_HOME%jrelibamd64文件夹里的jvm.cfg修改(jdk版本不一样对应的目录可能不叫amd64这个名字),jvm.cfg文件内容如下:
-server KNOWN-client IGNORE
当该参数不指定时,虚拟机启动检测主机是否为服务器,如果是,则以ServerVM启动,否则以ClientVM启动,检测的根据是至少2个CPU和最低2GB内存。
还有一种切换方式是每次执行java命令时在后面加上-client或-server的参数指定。
这里需要注意一点:无论是哪种方式切换,都是调用对应的jvm.dll执行的,所以在你本地必须有client和server各自对应的jvm.dll文件存在才行,否则无法切换虚拟机类型。
三.虚拟机工作模式
第一张图里的最后一个圈出的mixed mode表示虚拟机的工作模式为混合模式,在命令行输入java -X可以查看其它模式:
还有一种-Xcomp表示纯编译模式。
下面讲下三种模式的区别
解释模式和编译模式的区别上篇文章也有讲到,这里就不展开了
同样工作模式也可以切换,在命令行加上-Xint或-Xcomp的参数设置:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。