JVM 的生命周期
虚拟机的启动
Java 虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class) 来完成的,这个类是由虚拟机的具体实现指定的。
虚拟机的执行
- 一个运行中 Java 虚拟机有着一个清晰的任务:执行 Java 程序。
- 程序开始执行时他才运行,程序结束时他就停止。
- 执行一个所 谓的 Java 程序的时候,真真正正执行的是一个叫做 Java 虚拟机的进程。
虚拟机的退出
有如下几种情况:
- 程序正常执行结束
- 程序在执行过程中遇到了异常或错误而异常终止。
- 由于操作系统出现错误而导致 Java 虚拟机进程终止。
- 某线程调用 Runtime 类或 System 类的 exit 方法,或 Runtime 类的 halt 方法,并且 Java 安全管理器也允许这次 exit 或 halt 操作。
- 除此之外, JNI(Java Native Interface)规范描述了用 JNI Invocation API 来加载或卸载 Java 虚拟机时,Java 虚拟机的退出情况。
JVM 发展历程
Exact VM
- 为了解决上一个虚拟机问题, jdk1.2 时, sum 提供了此虚拟机。
Exat Memory Managment:准确式内存管理
- 也可以叫 Non-Conservative/Accurate Memory Managment
- 虚拟机可以知道内存中某个位置的数据具体是什么类型
具备现代高性能虚拟机的雏形:
- 热点探测
- 编译器与解释器混合工作模式
只在 Solaris 平台短暂使用,其他平台上还是 classic vm
- 英雄气短,终被 Hotspot 虚拟机替换。
SUN 公司 Hotspot VM
Hotspot 历史
- 最初由一家名为 "Longview Technologies" 的小公司设计;
- 1997 年,此公司被 SUN 公司收购,2009年, SUN 公司被甲骨文收购;
- JDK1.3 时, Hotspot VM 成为默认虚拟机。
目前 Hotspot 占有绝对的市场地位,称霸武林。
- 不管是现在仍在广泛使用的 JDK6,还是使用比例较多的 JDK8 中,默认的虚拟机都是 Hotspot;
- SUN/Oracle JDK 和 OpenJDK 的默认虚拟机;
- 因此本课程中默认介绍的虚拟机都是 Hotspot ,相关机制也主要是指 Hotspot 的 GC 机制。(比如其他两个商用虚拟机都没有方法区的概念)。
- 从服务器、桌面多移动端、嵌入式都有应用。
名称中 Hotspot 指的就是它的热点代码探测技术。
- 通过计数器找到最具编译价值代码,触发即时编译或栈上替换;
- 通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡。
BEA 的 JRockit
专注与服务器端应用
- 它可以不太关注程序启动速度,因此 JRockit 内部不包含解析器实现,全部代码都靠即时编译器编译后执行。
大量的行业基准测试显示,JRockit JVM 是世界上最快的 JVM。
- 使用 JRockit 产品,客户已经体验到了显著的性能提高(一些超过了 70%)和硬件成本的减少(达50%);
优势:全面的 Java 运行时解决方案组合。
- JRockit 面向延迟敏感型应用的解决方案 JRockit Real Time 提供以毫秒或微秒级别的 JVM 响应时间,适合财务、军事指挥、电信网络的需要。
- MissionControl 服务套件,它是一组以极低的开销来监控、管理和分析生产环境中的应用程序的工具。
- 2008 年, BEA 被 Oracle 收购。
- Oracle 表达了整合两大优秀虚拟机的工作,大致在 JDK8 中完成。整合的方式是在 Hotspot 的基础上,移植 JRockit 的优秀特性。
- 高斯林:目前就职于谷歌,研究人工智能和水下机器人。
IBM 的 J9
- 全称:IBM Technology for Java Virtual Machine,简称 IT4J,内部代码:J9
- 市场定位与 Hotspot 接近,服务器端、桌面应用、嵌入式等多用途 VM
- 广泛用于 IBM 的各种 Java 产品。
- 目前,有影响力的三大商用虚拟机之一,也号称是世界上最快的 Java 虚拟机。
- 2017 年左右,IBM 发布了开源 J9 VM ,命名为 OpenJ9,交给 Eclipse 基金会管理,也称为 Eclipse OpenJ9。
Taobao JVM
- 由 AliJVM 团队发布。阿里,国内使用 Java 最强大的公司,覆盖云计算、金融、物流、电商等众多领域,需要解决高并发、高可用、分布式的复合问题。有大量的开源产品。
- 基于 OpenJDK 开发了自己的定制版本 AlibabaJDK,简称 AJDK。是整个阿里 Java 体系的基石.
基于 OpenJDK HotSpot VM 发布的国内第一个优化、深度定制且开源的高性能服务器版 Java 虚拟机。
- 创新的 GCIH(GC invisible heap) 技术实现了 off-heap,即将生命周期较长的 Java 对象从 heap 中移动 heap 之外,并且 GC 不能管理 GCIH 内部的 Java 对象,以此达到降低 GC 的回收频率和提升 GC 的回收效率的目的。
- GCIH 中的对象还能够在多个 Java 虚拟机进程中实现共享。
- 使用 crc32 指令实现 JVM intrinsic 降低 JNI 的调用开销。
- PMU hardware 的 Java profiling tool 和诊断协助功能。
- 针对大数据场景的 ZenGC.
taobao VM 应用在阿里产品上性能高,硬件严重依赖 intel 的 CPU,损失了兼容性,但提高了性能。
- 目前已经在淘宝、天猫上线,把 Oracle 官方 JVM 版本全部替换了。
Dalvik VM
- 谷歌开发的,应用于 Android 系统,并在 Android2.2 中提供了 JIT,发展迅猛。
- Dalvik VM 只能称作虚拟机,而不能称作 “Java虚拟机”,它没有遵循 Java 虚拟机规范。
- 不能直接执行 Java 的 Class 文件。
- 基于寄存器架构,不是 JVM 的栈架构。
执行的是编译以后的 dex (Dalvik Executable)文件。执行效率比较高。
- 它执行的 dex (Dalvik Executeable) 文件可以通过 Class 文件转化而来,使用 Java 语法编写应用程序,可以直接使用大部分的 Java API 等。
- Android 5.0 使用支持提前编译(Ahead of Time Compilation, AOT)的 ART VM 替换 Dalvik VM.
具体 JVM 的内存结构,其实取决于其实现,不同厂商的 JVM,或者同意厂商的不同版本,都有可能存在一定的差异。本套课程主要以 Oracle Hotspot VM 为默认虚拟机。
Graal VM
- 2018 年 4 月,Oracle Labs 公开了 Graal VM,号称 "Run Programs Faster Anywhere",勃勃野心。与 1995 年 Java 的 “Write once, run anywhere” 遥相呼应。
- Graal VM 在 HotSpot VM 基础上增强而成的跨语言全栈虚拟机,可以作为”任何语言“的运行平台使用。语言包括:Java、Scala、Groovy、Kotlin、C、C++.....JavaScript、Ruby、Python、R 等。
- 支持不同语言中混用对方的接口和对象,支持这些语言使用已经编写好的本地库文件。
- 工作原理是将这些语言的源代码或源代码编译后的中间格式,通过解释器转换为被 Graal VM 接收的中间表示。Graal VM 提供 Truffle 工具集快速构建面向一种新语言的解释器。在运行时还能进行即时编译优化,获得比原生编译器更优秀的执行效率。
- 如果说 HotSpot 有一天真的被取代了,Graal VM 希望最大。但是 Java 的软件生态没有丝毫变化。