本书第三版撰写于2019年中期,书中所有的讲解、讨论都是基于这个时间点的Java技术,即JDK12和预览版的JDK13。
JDK各个版本发布时间及特性
JDK版本 | 名称 | 发布时间 |
---|---|---|
1.0 | Oak(橡树) | 1996-01-23 |
1.1 | 1997-02-19 | |
1.2 | Playground(运动场) | 1998-12-04 |
1.3 | Kestrel(美洲红隼) | 2000-05-08 |
1.4 | Merlin(灰背隼) | 2002-02-13 |
Java SE 5.0 / 1.5 | Tiger(老虎) | 2004-09-30 |
Java SE 6.0 / 1.6 | Mustang(野马) | 2006-04 |
Java SE 7.0 / 1.7 | Dolphin(海豚) | 2011-07-28 |
Java SE 8.0 | Spider(蜘蛛) | 2014-03-18 |
Java SE 9.0 | 2017-09-21 | |
Java SE 10.0 | 2018-03-21 | |
Java SE 11.0 | 2018-09-25 | |
Java SE 12.0 | 2019-02-07 | |
Java SE 13.0 | 2019-09-26 | |
Java SE 14.0 | 2020-03-17 | |
Java SE 15.0 | 2020-09-15 | |
Java SE 16.0 | 2021-03-16 |
1. 版本发布
- 从Java 8开始开发代号已经弃用了,所以从Java 8之后已经没有官方的开发代号了;
- Java 8u201/202 是最后一个免费的 Oracle JDK 8 版本,Oracle于 2019-01-15 停止免费商用更新;
2. 各版本新特性
- JDK1.4:正则表达式,异常链,NIO,日志类,XML解析器,XLST转换器;
- JDK1.5:自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环;
- JDK1.6:提供动态语言支持、提供编译API和卫星HTTP服务器API,改进JVM的锁,同步垃圾回收,类加载;
- JDK1.7:提供GI收集器、加强对非Java语言的调用支持、升级类加载架构;
- JDK8:Lambda 表达式、方法引用、默认方法、新工具、Stream API、Date Time API 、Optional 类、Nashorn, JavaScript 引擎;
- JDK9:集合加强、私有接口方法、垃圾收集机制、I/O流加强、JShell工具;
- JDK10:局部变量类型推断、线程本地握手、GC改进和内存管理;
- JDK11:字符串加强、HttClient Api、用于 Lambda 参数的局部变量语法、ZGC;
- JDK12:Switch Expressions、Shenandoah GC;
- JDK13:switch优化更新、文本块升级、重新实现旧版套接字API、核心库/java.util中的I18N、取消使用未使用的内存;
- JDK14:switch优化变更为最终版、垃圾回收相关、instanceof的模式匹配(预览版)、删除了安全库java.security.acl API、货币格式(优化);
- JDK15:Edwards-Curve数据签名算法(EdDSA)、封闭类(预览特性)、隐藏类、移除了Nashorn JavaScript 脚本引擎、重新实现DatagramSocket API 接口、禁用和废除偏向锁、instanceof的模式匹配(第二次预览)、ZGC垃圾回收器、Text Blocks文本块、Shenandoah垃圾回收器、移除Solaris和 SPARC 端口、外存访问 API(二次孵化)、废除 RMI 激活;
- JDK16:Vector API(孵化)、JDK C++的源码中允许使用C++14的语言特性、将 OpenJDK 社区的源代码存储库从 Mercurial 迁移到 Git、在 GitHub 上托管 OpenJDK 社区的 Git 存储库、ZGC 支持并发栈处理、对socket channel及server socket channel的api提供对unix domain socket的支持、将glibc的jdk移植到使用musl的alpine linux上、支持不再使用的class metadata归还内存给操作系统,降低内存占用、移植JDK到Windows/AArch64、提供jdk.incubator.foreign来简化native code的调用、提供ValueBased来用于标注作为value-based的类、提供 jpackage 打包工具打包独立的 Java 应用程序、Foreign-Memory Access API (三次孵化)、instanceof的模式匹配、Records语法糖、JDK 内部默认强封装、封闭类(二次预览);
走进Java
1. Java优点
- 结构严谨
- 面向对象
- 一次编写、到处运行
- 提供相对安全的内存管理和访问机制
- 实现热点代码检测和运行时编译及优化
- 完善的应用程序接口
- 无数的第三方类库
- 。。。
2. Java技术体系
-
组成部分
- Java程序设计语言
- 各种硬件平台上的Java虚拟机实现
- class文件格式
- Java类库api
- 第三方Java类库
-
JDK和JRE
- JDK:Java development kit,把Java程序设计语言、Java虚拟机、Java类库统称为JDK,JDK是用于Java程序开发的最小环境;
- JRE:Java runtime enviroment,把Java类库api的Java SE api子集和Java虚拟机统称为JRE,JRE是支持Java程序运行的标准环境;
-
Java产品线
- Java Card:支持Java小程序(Applets) 运行在小内存设备(如智能卡) 上的平台;
- Java ME(micro edition):支持Java程序运行在移动终端(手机、 PDA) 上的平台,在JDK 6以前被称为J2ME;
- Java SE(standard edition):支持面向桌面级应用(如Windows下的应用程序)的Java平台,在JDK 6以前被称为J2SE;
- Java EE(enterprise edition):支持使用多层架构的企业应用(如ERP、 MIS、 CRM应用) 的Java平台;
-
Java虚拟机家族
-
Sun Classic/Exact VM
- Sun Classic
- 世界上第一款商用Java虚拟机
- JDK 1.0 -- JDK 1.4
- 只能使用纯解释器方式来执行Java代码,要使用即时编译器必须进行外挂,并且两者不能同时运行,导致运行效率低;
- Exact VM
- Solaris平台
- JDK 1.2
- 使用准确式内存管理
- 具备现代高性能虚拟机雏形, 如热点探测、 两级即时编译器、 编译器与解释器混合工作模式等;
- Sun Classic
-
HotSpot VM
- JDK 1.2 -- 至今
- Sun/OracleJDK和OpenJDK中的默认Java虚拟机
- 目前使用范围最广的Java虚拟机
- 由一家名为“Longview Technologies”的小公司设计
- 继承了Sun之前两款商用虚拟机的优点,如准确式内存管理 、热点代码探测等
- 编译器与解释器可以协同工作
-
Mobile/Embedded VM
- Java ME中的Java虚拟机相比HotSpot要低调得多
- 在Java ME这条产品线上的虚拟机名为CDC-HI(C Virtual Machine, CVM) 和CLDC-HI(Monty VM)
-
BEA JRockit/IBM J9 VM
-
JRockit VM
- JDK 1.5 -- JDK 6
- BEA System公司开发
- 曾经号称是“世界上速度最快的Java虚拟机”
- 一款专门为服务器硬件和服务端应用场景高度优化的虚拟机
- JRockit内部不包含解释器实现, 全部代码都靠即时编译器编译后执行
-
J9 VM
- -- 至今
- IBM公司开发
- 一款在设计上全面考虑服务端、 桌面应用, 再到嵌入式的多用途虚拟机
- 职责分离与模块化做得比HotSpot更优秀
-
-
BEA Liquid VM/Azul VM
-
Liquid VM
- BEA公司开发
- 直接运行在自家Hypervisor系统上的JRockit虚拟机的虚拟化版本
- 不需要操作系统的支持, 或者说它自己本身实现了一个专用操作系统的必要功能
-
Azul VM
- Azul Systems公司开发
- 运行于Azul Systems公司的专有硬件Vega系统上的Java虚拟机
- 每个Azul VM实例都可以管理至少数十个CPU和数百GB的内存的硬件资源, 并提供在巨大内存范围内停顿时间可控的垃圾收集器
-
-
Apache Harmony/Google Android Dalvik VM
-
Harmony VM
- Apache软件基金会开发
- Apache软件基金会旗下以Apache License协议开源的实际兼容于JDK 5和JDK 6的Java程序运行平台
- 没有通过TCK(Technology Compatibility Kit )认证,所以为非Java虚拟机
-
Dalvik VM
- 曾经是Android平台的核心组成部分之一
- 非Java虚拟机,没有遵循《Java虚拟机规范》 , 不能直接执行Java的Class文件, 使用寄存器架构而不是Java虚拟机中常见的栈架构
-
-
Microsoft JVM
- Microsoft JVM
- 微软公开发
- 在浏览器中运行Java Applets程序
- 只有Windows平台的版本
- 当时Windows系统下性能最好的Java虚拟机
- Microsoft JVM
-
其他
-
KVM
- 强调简单、 轻量、 高度可移植
- 运行速度比较慢
- 曾经在手机平台上得到非常广泛应用
-
Java Card VM
- Java虚拟机很小的一个子集
- 用于智能卡、 SIM卡、 银行信用卡、 借记卡
-
Squawk VM
- Sun公司开发
- 运行于Sun SPOT
- 一个Java代码比重很高的嵌入式虚拟机实现
-
JavaInJava
- Sun公司开发
- 以Java语言来实现Java语言本身的运行环境的“元循环” 虚拟机
- 通过元循环证明一门语言可以自举, 是具有它的研究价值的
-
Maxine VM
- 一个几乎全部以Java代码实现(只有用于启动Java虚拟机的加载器使用C语言编写) 的元循环Java虚拟机
- 执行效率靠谱、 先进的即时编译器和垃圾收集器
-
Jikes RVM
- IBM开发
- 是一个元循环虚拟机
- 专门用来研究Java虚拟机实现技术的项目
-
IKVM.NET
- 基于微软.NET框架实现的Java虚拟机
- 借助Mono获得一定的跨平台能力
- IKVM.NET可以将Class文件编译成.NET Assembly, 在任意的CLI上运行
-
-
-
Java技术的未来
- 无语言倾向--Graal VM
- 一个在HotSpot虚拟机基础上增强而成的跨语言全栈虚拟机
- 可以作为“任何语言”的运行平台使用,如Java、 Scala、Groovy、 Kotlin、C、 C++、 Rust等
- 基本工作原理是将这些语言的源代码或源代码编译后的中间格式通过解释器转换为能被Graal VM接受的中间表示(Intermediate Representation,IR);这个过程称为程序特化(Specialized, 也常被称为Partial Evaluation)
- 对于一些本来就不以速度见长的语言运行环境, 由于Graal VM本身能够对输入的中间表示进行自动优化, 在运行时还能进行即时编译优化, 因此使用Graal VM实现往往能够获得比原生编译器更优秀的执行效率
- 新一代即时编译器--Graal编译器
- HotSpot虚拟机中含有两个即时编译器
- C1:编译耗时短但输出代码优化程度较低的客户端编译器,简称为C1
- C2:编译耗时长但输出代码优化质量也更高的服务端编译器,简称为C2
- 以C2编译器替代者的身份登场
- Graal编译器本身就是由Java语言写成,实现时又刻意与C2采用了同一种名为“Sea-of-Nodes”的高级中间表示(High IR) 形式, 使其能够更容易借鉴C2的优点
- 在保持输出相近质量的编译代码的同时, 开发效率和扩展性上都要显著优于C2编译器
- HotSpot虚拟机中含有两个即时编译器
- 向Native迈进
- 在微服务架构的视角下,应用拆分后, 单个微服务相对于需求,Java的启动时间相对较长, 需要预热才能达到最高性能
- Java逐步提供提前编译支持,提前编译能带来的最大好处是Java虚拟机加载这些已经预编译成二进制库之后就能够直接调用, 而无须再等待即时编译器在运行时将其编译成二进制机器码,减少即时编译带来的预热时间
- Substrate VM满足了人们心中对Java提前编译的全部期待
- HotSpot持续重构优化
- 语言语法持续增强
- 无语言倾向--Graal VM