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具体如何编译和优化,能够参考上一篇文章里介绍的:JVM学习笔记之codeCache
而JIT编译只是一种概念,HotSpot内置C1,C2这两种编译器实现:
- C1:编译工夫短,优化策略简略
- C2:编译工夫长,优化策略简单
C1,C2 都属于JIT编译技术,是JIT的不同实现
二. 虚拟机类型client server的区别
HotSpot虚拟机分client端和server端,精确的说应该是分两种类型,因为client,server VM是两种实用不同业务场景的虚拟机类型。
- client VM 应用的是C1编译器
- server VM 应用的是C2编译器
在第一张图中圈出的Server VM应用的就是C2编译器。
所以client server最大的区别就是C1和C2的区别,次要体现在编译策略上:
- Client启动快,内存占用少,编译快,针对桌面应用程序优化(比方GUI),为在客户端环境中缩小启动工夫而优化
- Server启动慢,然而一旦运行起来后,性能将会有很大的晋升,因为编译更齐全,效率高,针对服务端利用优化
大家能够依据具体的业务场景抉择,不过当初的零碎大部分都是B/S架构,前后端又是拆散的,所以咱们用的虚拟机大部分都是server类型。
网上有张c++和java的性能比照,如下:
能够看到最显著的差别是JVM client端和server端对于method call办法调用上的性能比照(红色是server VM,黄色是client VM,越高越好)。
另外client/server VM除了在编译策略和性能上的区别外,在内存调配和GC上也不一样:
- client 默认
-Xms
是1M,-Xmx
是64M,新生代抉择的是串行gc,旧生代抉择的是串行gc - server 默认
-Xms
是128M,-Xmx
是1024M,新生代抉择的是并行回收gc,旧生代抉择的是并行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
示意纯编译模式。
上面讲下三种模式的区别
- -Xmixed 混合模式:
mixed mode
是HotSpot虚拟机的默认工作模式,在上篇文章中讲到过虚拟机执行字节码分两种形式:解释执行和编译执行,编译执行就是JIT(C1/C2),所以混合模式就是解释执行+编译执行(依据clientVM还是serverVM类型辨别应用C1还是C2编译器),这样就能够施展解释执行和编译执行的劣势。 - -Xint 解释模式:
interpreted mode
,强制JVM以解释形式执行所有的字节码 - -Xcomp 编译模式:
compiled mode
,与-Xint相同,JVM在第一次应用时会把所有的字节码编译成本地代码(理论我测试下来的成果并不如混合模式)
解释模式和编译模式的区别上篇文章也有讲到,这里就不开展了
同样工作模式也能够切换,在命令行加上-Xint
或-Xcomp
的参数设置:
文章起源:http://javakk.com/207.html