《深入理解Java虚拟机-JVM高级特性与最佳实践(第三版)》学习日记一

本书第三版撰写于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程序运行的标准环境;
JDK和JRE的API.png
  • 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
        • 使用准确式内存管理
        • 具备现代高性能虚拟机雏形, 如热点探测、 两级即时编译器、 编译器与解释器混合工作模式等;
    • 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虚拟机
    • 其他

      • 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编译器
    • 向Native迈进
      • 在微服务架构的视角下,应用拆分后, 单个微服务相对于需求,Java的启动时间相对较长, 需要预热才能达到最高性能
      • Java逐步提供提前编译支持,提前编译能带来的最大好处是Java虚拟机加载这些已经预编译成二进制库之后就能够直接调用, 而无须再等待即时编译器在运行时将其编译成二进制机器码,减少即时编译带来的预热时间
      • Substrate VM满足了人们心中对Java提前编译的全部期待
    • HotSpot持续重构优化
    • 语言语法持续增强
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容