第 1 章:走近 Java

本文最后更新于:1 年前

《深入理解Java虚拟机(第3版)》样例代码&勘误
https://github.com/fenixsoft/jvm_book
后印刷的书都会修正前面发现的错误,网上找到的 pdf 电子版书一般都不是彩色印刷,而电子版的图片是彩色的一般都不是修正后的版本,需要特别留意。
以后买书得注意一下印刷版次是不是比较新的,便宜的可能就是早期版本。

口号:Write Once, Run Anywhere。(一次编译,到处运行。)

JCP:Java Community Process,Java 社区。

JCP 定义的 Java 技术体系:

  • Java 程序设计语言
  • 各种硬件平台上的 Java 虚拟机实现
  • Class 文件格式
  • Java 类库 API
  • 来自商业机构和开源社区的第三方 Java 类库

JDK:Java Development Kit,包括:

  • Java 程序设计语言
  • Java 虚拟机
  • Java 类库

JRE:Java Runtime Environment,包括:

  • Java 虚拟机
  • Java 类库 API中的 Java SE API 子集

Java 起源:绿色计划,目标是开发一种能够在各种消费性电子产品上运行的程序架构。

Java 虚拟机:

  • 【Sun】Classic VM:
    • 解释器和外挂的即时编译器只能二选一。
    • 基于句柄(Handle)的对象查找方式。
      因为垃圾收集后对象可能会被移动位置,所以要使用句柄来保持引用值的稳定。
  • 【Sun】Exact VM:
    • 使用准确式内存管理(Exact Memory Management,指虚拟机可以知道内存中某个位置的数据具体是什么类型)。
      准确分辨出哪些内存是引用类型,是在垃圾收集时准确判断堆上的数据是否还可能被使用的前提。相比于 Classic VM 在定位对象时少了一次间接查找的开销。
    • 有热点探测、两级即时编译器、编译器与解释器混合工作模式。
  • 【Sun/Oracle】HotSpot VM(与 Exact VM 功能几乎一样):
    • 有热点代码探测技术。
      通过执行计数器找出最具有编译价值的代码,通知即时编译器以方法为单位进行编译。
    • 有两级即时编译器。
      如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准即时编译和栈上替换编译行为。
    • 有编译器与解释器混合工作模式。
  • 【Google】Dalvik VM:
    • 不是一个 Java 虚拟机(没有遵循《Java 虚拟机规范》,不能直接执行 Java 的 Class 文件),使用寄存器架构而不是 Java 虚拟机中常见的栈架构,但是它执行的 DEX(Dalvik Executable)文件可以通过 Class 文件转化而来。
  • 【Google】ART VM:
    • 支持提前编译(Ahead of Time Compilation,AOT)。
      在移动设备性能不强时,提前编译比即时编译更容易获得高性能。但是破坏了“一次编译,到处运行”的承诺;而且很多根据运行信息优化的措施不能使用。

面向未来的研究项目:

  • 【Oracle】Graal VM:
    • 口号:Run Programs, Faster Anywhere。
    • 在 HotSpot 虚拟机基础上增强而成的跨语言全栈虚拟机,包括基于 Java 虚拟机之上的语言、基于 LLVM 的语言(C语言等)、JavaScript、Python、R 等。支持不同语言中混用对方的接口和对象。
    • 基本工作原理:将源代码或源代码编译后的中间格式(LLVM 字节码等)通过解释器转换为能被 Graal VM 接受的中间表示,该过程成为程序特化(Specialized,或 Partial Evaluation)。
    • Substrate VM:Graal VM 里的一个极小型的运行时环境,可以显著降低内存占用及启动时间,十分适合嵌入其他系统。
      目标是替代 HotSpot,支持提前编译后的程序执行。