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 的软件生态没有丝毫变化。
Last modification:April 20, 2020
如果觉得我的文章对你有用,请随意赞赏