深入理解JVM第三版笔记(2)-虚拟机家族

虚拟机家族

虚拟机始祖 Sun Classic / Exact VM

JDK1.2以前所带的VM,只能用纯解释器的方式来执行,需要使用即时编译的话就需要进行外挂,但这样即时编译器就会完全接管虚拟机的执行系统,解释器就不能执行了.由于解释器和编译器不能配合工作,这就意味着如果要编译执行,就不得不对每一行代码进行编译,无论它们是否具有编译的价值,基于程序响应时间压力,编译器不敢应用编译耗时稍高的优化技术,因此这个阶段的虚拟机虽然用了即时编译器输出本地代码,但执行效率和传统C/C++的程序有很大差距,"Java语言很慢"的印象就是在这个阶段开始在用户心中建立起来.

Sun的虚拟机团队在Solaris平台发布过Exact VM,它的编译执行系统已经具备现代高性能虚拟机雏形,比如热点预测,两级即时编译,解释器与编译器混合工作模式等.准确式内存管理,是指虚拟机可以知道内存中某个位置的数据具体是什么类型,比如内存中有一个32bit的整数为123456,虚拟机可以分辨它是一个整型还是一个引用类型.由于使用了准确式内存管理,Exact VM可以抛弃Sun Classic VM基于句柄(Handle)的对象查找方式,这样每次定位对象都减少了一次间接查找的开销.(垃圾回收时,内存中的数据可以被移动,比如123456移动到了654321,如果不知道对象的类型,就不敢把所有123456的值替换为654321).

Sun Classic VM JDK1.2之前是唯一的VM,JDK1.2时与HotSpot并存,JDK1.3 HotSpot作为默认虚拟机,JDK1.4 Classic VM退出了商用虚拟机的舞台.

武林盟主 HotSpot VM

它是Oracle和OpenJDK中的默认虚拟机,也是目前使用最为广泛的虚拟机.它最初由一家"Longview Technologies"小公司设计,并且最初并非为Java语言而开发,其中相当多技术来源于一款支持Self语言(达到C语言50%以上的执行效率)的Self虚拟机.

顾名思义,其中的HotSpot就是指的它的热点代码探测技术,通过执行计数器找到最有价值的热点代码,然后通知即时编译器以方法为单位进行编译,会触发标准即时编译和栈上替换编译动作.解释器与编译器协同工作,可以在程序响应时间和执行性能中取得平衡,无需等待本地代码输出才能执行程序,即时编译的压力也相对减少.

小家碧玉 Mobile/Embedded VM

移动和嵌入式市场专用VM,为适用嵌入式环境专门定制裁剪的版本.

天下第二 BEA JRockit /IBM J9 VM

JRockit号称世界上速度最快的VM,BEA将其发展为专门为服务器端高度优化的虚拟机,不关注启动速度,JRockit内部不包含解释器,全部代码靠即时编译后执行.

J9 由IBM公司开发,它在设计上全面考虑服务端,桌面应用再到嵌入式的多用途虚拟机

软硬合璧 BEA Liquid VM /Azul VM

一类与特定硬件平台绑定的,软硬件配合工作的专用VM,往往能实现更高的执行性能,或者提供某些特殊的功能特性.

BEA Liquid VM运行在BEA公司自家开发的Hypervisor系统上的JRockit虚拟机的虚拟化版本,它不需要操作系统的支持,或者说它本身实现了一个专用操作系统的必要功能,如线程调度,文件系统,网络支持等.由虚拟机越过通用操作系统直接控制硬件可以获得很多好处,比如在线程调度时,不需要再进行内核态/用户态的切换,这样可以最大限度发挥硬件的能力,提升Java程序的执行性能.

Azul VM运行与Azul Systems公司专有硬件Vega系统上的JVM,每个Azul VM实例都可以管理至少数十个CPU和数百GB内存,并提供在巨大内存范围内停顿时间可控的垃圾收集器(即赫赫有名的PGC和C4收集器),为专有硬件优化的线程调度等优秀特性.

2010年Azul公司的重心开始从硬件转向为软件,发布了自己的Zing虚拟机,可以在通用x86平台上提供接近于Vega系统的性能和一致的功能特性.Zing虚拟机是从HotSpot某旧版代码分支基础上独立出来重新开发的高性能Java虚拟机,在要求低延迟,快速预热等场景中,Zing VM都要比HotSpot表现得更好.Zing的PGC和C4收集器可以轻易支持TB级别的Java堆内存,而且保证暂停时间仍然可以维持在不超过10毫秒的范围里.HotSpot要一直到JDK11和JDK12的ZGC以及Shenandoah收集器才达到了相同目标,而且目前的效果仍然远不如C4.Zing的ReadyNow!功能可以利用之前运行时收集到的性能监控数据,引导虚拟机在启动后快速达到稳定的高性能水平.减少启动后从解释执行到即时编译的等待时间.

Zing让普通用户无需了解垃圾收集等底层调优,就可以使得Java应用享有低延迟,快速预热,易于监控的功能,这是Zing的核心价值和买点,很多Java应用可以通过长期努力在应用和框架层面来优化提升性能,但使用Zing的话就可以把精力更多集中在业务方面.

挑战者 Apache Harmony/Google Android Dalvik VM

这里的Harmony虚拟机(Harmony里的DRLVM) 和Dalvik虚拟机只能称作虚拟机而不是Java虚拟机,Harmony没有通过TCK认证(兼容性测试),Harmony没有真正地被大规模商业运用过,但是它的许多代码被吸纳进IBM的JDK7和Google Android SDK中,尤其是对Android的发展起了很大的推动作用.

Dalvik虚拟机曾经是Android平台的核心组成部分之一,它没有遵循Java虚拟机规范,不能直接执行Java的Class文件,指定的DEX(Dalvik Executable)文件可以通过Class文件转化而来,和Java有着千丝万缕的联系.到了Android4.4时代,支持提前编译的(AOT Ahead of Time Compilation)ART虚拟机迅速崛起,在性能不是特别强大的移动设备上,提前编译比即时编译更容易获得高性能,在Android5里ART全面替代了Dalvik虚拟机

没有成功,但并不失败的Microsoft VM和其他

posted @ 2020-04-16 20:41  柿子君  阅读(198)  评论(0)    收藏  举报