概述

Java不仅仅是一门编程语言,它还是一个由一系列计算机软件和规范组成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛用于千余如系统、移动终端、企业服务器、大型机等多种场合

Java技术体系

从广义上讲,Kotlin、Clojure、JRuby、Groovy等运行于Java虚拟机上的编程语言及其相关的程序都属于Java技术体系

JCP官方规定Java技术体系:

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

JDK:把Java程序设计语言、Java虚拟机、Java类库这三部分统称为JDK(Java Development Kit)
image.png

Java发展史

  • HotSpot虚拟机刚发布时是作为JDK1.2附加程序提供,称为JDK1.3及之后所有KDL版本的默认Java虚拟机
  • 2006年,Sun公司在JavaOne大会上,宣布计划把Java开源,并建立OpenJDK组织对这些源码进行独立管理
  • Sum被Oracle收购后,商业化浓重,每六个JDK大版本中才会被划出一个长期支持(Long Term Support,LTS)版提供为期三年的支持和更新,普通版本只有六个月。JDK8和JDK11是LST版本
  • Oracle从JDK11起把以前的商业特性(JMC、JFR、NMT等)全部开源给OpenJDK。故OracleJDK 11和OpenJDK 11代码和功能本质上是完全相同的
  • RedHat(IBM小弟)从Oracle手上结果OpenJDK 8和OpenJDK 11的管理权力和维护职责

Java虚拟机家族

虚拟机始祖:Sun Classic/Exaxt VM

Sun Classic VM(第一款商用Java虚拟机)

只能使用纯解释器方式来执行Java代码,如果要使用即时编译器那就必须要进行外挂,但是假如外挂了即时编译器,则即时编译器就会完全接管虚拟机的执行系统,解释器便不能再工作了

Exaxt VM

因使用准确式内存管理(Exact Memory Management)而得名。准确式内存管理是指虚拟机可以知道内存中某个位置的数据具体是什么类型(引用类型还是其他类型)
只存在了很短时间被HotSpot VM 所替代

武林盟主:HotSpot VM

它是Sun/OracleJDK 和OpenJDK中的默认Java虚拟机。
HotSpot既继承了Sun之前两款商用虚拟机的有点(准确式内存管理)。通过编译器与解释器恰当地协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无需等待本地代码输出才能执行程序,及时编译的时间压力也相对减小,这样有助于引入更复杂的代码优化技术,输出质量更高的本地代码。
JDK8时期,HotSpot移除掉永久代,吸收了JRockit的Java Mission Control监控工具等功能

小家碧玉:Mobile/Embedded VM

面对移动和嵌入式市场,Java ME中的Java虚拟机处于比较尴尬的位置(Andrioid和IOS)。
国内的老人手机和出口到经济欠发达国家的功能手机还在广泛使用这种更加简单、资源消耗也更小的上一代Java ME 虚拟机(KVM)

天下第二:BEA JRockit/IBM J9 VM

EBA System公司的JRockit与IBM公司的IBM J9和HotSpot并称“三大商业Java虚拟机”

  • JRockit:专门为服务器硬件和服务端应用场景高度优化的虚拟机,内部不包含解释器实现,全部代码都靠即时编译器编译后执行
  • J9:全面考虑服务端、桌面应用,再到嵌入式的多用途虚拟机,如果为了学习虚拟机技术而去阅读源码,更加模块化的OpenJ9代码比HotSpot更适合阅读

软硬合璧:BEA Liquid VM/Azul VM

与特定硬件平台绑定、软硬件配合工作的专有虚拟机

挑战者:Apache Harmony/Google Android Dalvik VM

这两款确切的说只能称作虚拟机,而不能称作Java虚拟机

  • Apache Harmony:没有通过TCK认证(Technology Compatibility Kit 兼容性测试),所以不能用java虚拟机来代指
  • Google Android Dalvik VM:Dalvik虚拟机并不是一个Java虚拟机,没有遵循Java虚拟机规范,不能直接运行Java的Class文件,是哟个寄存器架构而不是Java虚拟机中常用的栈架构。但它执行的DEX(Dalvik Executable)文件可以通过Class文件转化而来,使用Java语法编写的应用程序,可以直接使用绝大部分的Java API

没有成功,但并非失败:Microsoft JVM及其他

Microsoft 为了IE3支持Java Applets应用开发的Java虚拟机,后应为Sun交涉被放弃

百家争鸣

KVM

简单、轻量、高度可移植,但是运行速度比较慢,在Android、IOS等只能手机操作系统出现前被广泛应用

Java Card VM

Java虚拟机的很小子集,可以放入智能卡、SIM卡、银行卡等内,负责对Java Applet程序进行解释执行

Squawk VM

由Sun开发,应用于Sun SPOT和Java Card

JavaInJava

Sun公司的实验性质虚拟机

Maxine VM

Jikes RVM

IKVM.NET

展望Java技术的未来

无语言倾向

Graal VM被官方称为"Universal VM"和"Polyglot VM",在HotSpot虚拟机基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用,包括基于Java虚拟机上的语言和C、C++、Rust等基于LLVM的语言和Python、R语言等

新一代即时编译器

对需要长时间运行的应用来说,由于经过充分预热,热点代码会被HotSpot的探测机制准确定位捕获,并将其编译为物理硬件可直接执行的机器码,在这类应用中Java的运行效率很大程度上取决于即时编译器所输出的代码质量

向Native迈进

对不需要长时间运行的,或者小型化的应用语言,大型单体应用结构向小型微服务应用架构发展的技术潮流下,Java有一些劣势

灵活的胖子

HotSpot的定位是面向各种不同的应用场景的全功能Java虚拟机,HotSpot开发团队正在持续地重构着HotSpot的架构,让它具有模块化的能力和足够的开放性

  • JDK9 HotSpot虚拟机开放了Java语言级别的编译器接口
  • JDK10 HotSpot重构了Java虚拟机的垃圾收集器接口

语言语法持续增强

  • 语法糖
  • Project Loom:由软件自身进行调度的用户现场
  • Project Valhalla:提供值类型和基本类型的泛型支持,并提供明确的不可变类型和非引用类型的声明。
  • Project Panama:消弭Java虚拟机与本地代码之间的界限

实战:自己编译JDK

想要了解Java虚拟机内部的实现原理,直接一条路径就是编译一套自己的JDK,通过阅读和跟踪调试JDK源码来了解Java技术体系的运作。
Java类库里的很多底层方法都是Native的,在了解这些方法的运作过程,或对JDK进行Hack(根据需要进行定制微调)的时候,都需要有能自行编译、调试虚拟机代码的能力。

获取源码

OpenJDK和OracleJDK之间的区别

  • OpenJDK是Sun公司在2006年末把Java开源而形成的项目。源码仓库只包含了标准Java SE的源代码,而一些额外的模块,典型的如JavaFX,是存放在独立的源码仓库中
  • OracleJDK的安装包中会包含JavaFX这种独立的模块,而用OpenJDK的话则需要单独下载安装。
  • 在JDK11以前,OracleJDK还会存在一些OpenJDK没有的、闭源的功能,即OracleJDK的“商业特性”
  • 在JDK11及以后,二者代码实质上基本完全一致,我们所编仪的OpenJDK基本上可以认为性能、功能和执行逻辑上都和官方的OracleJDK是一致的

获取OpenJDK源码的方式

  • 通过Mercurial代码版本管理工具从Repository中直接取得源码(访问速度较慢)
  • 直接在仓库中打包出源码压缩包,再进行下载
    http://hg.openjdk.java.net/jdk
    image.png
    image.png
    image.png

这个家伙很懒,啥也没有留下😋