一:Sun Classic VM虚拟机
早在1996年Java1.0版本的时候,Sun公司发布了一款名为Sun classic VM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,JDK1.4时完全被淘汰。 现在hotspot内置了此虚拟机。
这款虚拟机内部只提供解释器,当前主流的虚拟机都会提供解释器+JIT及时编译器。
如果使用JIT编译器,就需要进行外挂。但是一旦使用了JIT编译器,JIT就会接管虚拟机的执行系统。解释器就不再工作。解释器和编译器不能配合工作。这样做会有什么问题呢?将所有的字节码指令(不仅仅是热点代码)都编译好缓存起来。编译成机器码的时候也是要花时间的,每一行都进行编译会消耗时间,也就会暂停时间过长,导致程序启动的时候会有一段时间卡顿。二者结合起来效率更高。
以下是JVM虚拟机执行引擎下的解释器与JIT及时编译器的图解:
只提供解释器不提供及时编译器的话在功能上是没有问题的,都可以将字节码中的指令按照顺序一行一行的解释执行,但是执行效率来讲相对是比较差的。 比如说:循环两万次,那么循环中的两万次代码都会被一遍遍解释执行。(热点代码的概念就是,程序中反复被执行的代码)热点代码被执行下来之后,会被编译成本地指令缓存起来,下次执行就不需要在进行编译了,这是它高效的原因。
二:Exact VM虚拟机
为了解决上一个虚拟机问题,jdk1.2时,sun提供了此虚拟机。
Exact Memory Management:准确式内存管理。
虚拟机可以准确知道内存某一个位置的数据类型具体是什么类型的。具体引用的这个内容是一个具体的数据大小,还是一个对象的地址,在这个虚拟机当中是可以准确知道的。我们知道一些垃圾回收方式会导致对象被整理、地址被改变(标记整理算法、复制算法),这样的虚拟机就可以支持这样的垃圾回收方式。
也可以叫Non-Conservative/Accurate Memory Management
虚拟机可以知道内存中某个位置的数据具体是什么类型。
具备现代高性能虚拟机的雏形:
热点探测,可以快速识别热点代码
编译器与解释器混合工作模式,大大提高了程序的运行速度。
只在Solaris平台短暂使用,其他平台上还是classic vm
英雄气短,终被Hotspot虚拟机替换
三:HotSpot VM虚拟机
最初由一家名为“Lonqview Technologies”的小公司设计
1997年,此公司被Sun收购;2009年,Sun公司被甲骨文收购。
JDK1.3时,HotSpot VM成为默认虚拟机
不管是现在仍在广泛使用的JDK6,还是使用比例较多的JDK8中,默认的虚拟机都是HotSpot
Sun/Oracle JDK 和 OpenJDK的默认虚拟机
因此本系列文章中默认介绍的虚拟机都是HotSpot,相关机制也主要是指HotSpot的GC机制。(比如其他两个商用虚拟机都没有方法区的概念)从服务器、桌面到移动端、嵌入式都有应用。
名称中的HotSpot指的就是它的热点代码探测技术通过计数器找到最具编译价值代码,触发即时编译或栈上替换通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡