一、概述
我们常说的JDK (Java Development Kit)包含了Java语言、Java虚拟机和Java API类库这三部分,是Java程序开发的最小环境。而JRE (Java Runtime Environment)包含了JavaAPI中的Java SE API子集和Java虚拟机这两部分,是Java程序运行的标准环境。那么可以看出Java虚拟机的重要性,它是整个Java平台的基石,是Java语言编译代码的运行平台。你可以把Java虚拟机看作一个抽象的计算机,它有各种指令集和各种运行时数据区域。虽然叫Java虚拟机,但其实在它之上运行的语言可不仅仅是Java,还包括Kotlin, Groovy,Scala. Jython ,因此对于Android开发来说,不管你开发用的是Java还是Kotlin,你都f要去理解Java虚拟机。
1、 Java虚拟机家族
有些人可能认为Java虚拟机就是“一个”虚拟机而已,它还有家族?或者认为Java虚拟机指的就是Oracle的HotSpot虚拟机,这里来简单介绍Java虚拟机家族,自从1996年Sun公司发布的JDK1.0中包含的Sun Classic VM到今天,出现和消亡了很多种虚拟机,我们这里只简单介绍目前存活的相对主流Java虚拟机。
- HotSpot VM
Oracle JDK和OpenJDK中自带的虚拟机,是最主流的和使用范围最广的Java虚拟机。 介绍Java虚拟机的技术文章,如果不做特殊说明,大部分都是介绍HotSpot VM的.
HotSpotVM并非是Sun公司开发的,而是由Longview Technologies这家小公司设计的,它在1997年被Sun公司收购,
Sun公司又在2009年被Oracle收购。- J9 VM
J9 VM是IBM开发的虚拟机,目前是其主力发展的Java虚拟机。J9 VM的市场定位和HoiSpot VM接近,它是一款设计上从服务器端到桌面应用再到嵌入式都考虑到的多用途虚拟机,目前19 VM的性能水平大致与HotSpot
VM是一个档次的。- Zing VM
以Oracle的HotSpot VM为基础,改进了许多影响延迟的细节。最大的3个卖点如下:
- 低延迟, “无暂停”的C4 GC, GC带来的暂停可以控制在10ms以下的级别,支持的Java堆大小可以达到1TB.
- 启动后快速预热功能。
- 可管理性:零开销、可在生产环境全时开启、整合在JVM内的监控工具Zing Vision.
需要注意的是, Android中的Dalvik和ART虚拟机并不属于Java虚拟机,因此这里没有列出它们,关于Dalvik和ART虚拟机将在下次进行介绍。
2 、Java虚拟机执行流程
当我们执行一个Java程序时,它的执行流程如图所示。
从上图可以发现Java虚拟机执行流程分为两大部分,分别是编译时环境和运行时环境,当一个Java文件经过Java编译器编译后会生成Class文件,这个Class文件会由Java虚拟机来进行处理。Java虚拟机与Java语言没有什么必然的联系,它只与特定的二进制文件: Class文件有关。因此无论任何语言只要能编译成Class文件,就可以被Java虚拟机识别并执行
二、Java虚拟机内存结构
具体请参考(JVM)Java虚拟机的内存结构详解
三、Java对象的创建、内存布局 & 访问定位
四、垃圾标记算法
具体请参考(GC)垃圾标记算法详解攻略
五、垃圾收集算法
具体请参考(GC)垃圾收集算法详解攻略
六、常见的垃圾收集器
具体请参考常见的垃圾收集器总结
七、类的生命周期(类加载的5个过程)
具体请参考(JVM)Java虚拟机:类的生命周期(类加载的5个过程)详解
八、类加载器
具体请参考(JVM)Java虚拟机:类加载器详解(双亲委派模型)
九、Java虚拟机方法分派模型
具体请参考(JVM)Java虚拟机:静态分派 & 动态分派 原理解析
总结
Java虚拟机是一个庞大的知识体系,此次也只是介绍了Java虚拟机知识中的非常少的一部分,对于Android开发,这些知识已经完全够用,如果想要深入了解Java虚拟机则需要阅读专业介绍Java虚拟机的书。
参考:Android进阶解密