深入理解JVM:走近Java
Java技术体系
- 从广义上讲,Kotlin、Clojure、JRuby、Groovy等运行于Java虚拟机上的编程语言及其相关的程序都属于Java技术体系中的一员。
从传统意义上来看,JCP官方(Java Community Process,就是人们常说的“Java社区”)所定义的Java技术体系包括了以下几个组成部分:
- Java程序设计语言
- 各种硬件平台上的Java虚拟机实现
- Class文件格式
- Java类库API
- 来自商业机构和开源社区的第三方Java类库
- JDK(Java Development Kit):Java程序设计语言、Java虚拟机、Java类库,三部分的统称,
- JDK是用于支持Java程序开发的最小环境
- JRE(Java Runtime Environment):Java类库API中的Java SE API子集和Java虚拟机,两部分的统称,
- JRE是支持Java程序运行的标准环境。
以Java技术体系划分为以下四条主要的产品线:
- Java Card:支持Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。
- Java ME(Micro Edition):支持Java程序运行在移动终端(手机、PDA)上的平台,对Java API有所精简,在JDK 6以前被称为J2ME。
- Android 不属于Java ME !
- Java SE(Standard Edition):支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API,JDK 6以前被称为J2SE。
- Java EE(Enterprise Edition):支持使用多层架构的企业应用(如ERP、MIS、CRM应用)的Java平台,除了提供Java SE API外,还对其做了大量有针对性的扩充(javax.* 下),JDK 6以前被称为J2EE;
- 在JDK 10以后被Oracle放弃,捐献给Eclipse基金会管理,此后被称为Jakarta EE。
Java发展史
- 起源:由James Gosling博士领导的绿色计划(Green Project)开始启动,其产品就是Java语言的前身:Oak(得名于James Gosling办公室外的一棵橡树)。
时间 | JDK 版本 | 描述 |
---|---|---|
1995年5月23日,Oak语言改名为Java,并且在SunWorld大会上正式发布Java 1.0版本。Java语言第一次提出了“Write Once,Run Anywhere”的口号。 | ||
1996年1月23日 | 1.0 | 第一个正式版本的运行环境。JDK 1.0提供了一个纯解释执行的Java虚拟机实现(Sun Classic VM)。
|
1997年2月19日 | 1.1 | Java里许多最基础的技术支撑点(如JDBC等)都是在JDK 1.1版本中提出的。
|
1998年12月4日 | 1.2(layground竞技场) | Java技术体系被拆分为三个方向:J2SE、J2EE、J2ME。
|
1999年4月27日,HotSpot虚拟机诞生:发布时是作为JDK 1.2的附加程序提供的,后来它成为JDK 1.3及之后所有JDK版本的默认Java虚拟机。 | ||
2000年5月8日 | 1.3(美洲红隼Kestrel) | 改进了主要体现在Java类库上(如数学运算和新的Timer API等),* JNDI服务从JDK 1.3开始被作为一项平台级服务提供(以前JNDI仅仅是一项扩展服务),使用CORBA IIOP来实现RMI的通信协议,等等。这个版本还对Java 2D做了很多改进,提供了大量新的Java 2D API,并且新添加了JavaSound类库。
|
2002年2月13日 | 1.4(灰背隼Merlin) | JDK 1.4是标志着Java真正走向成熟的一个版本。
|
2002年前后,微软的.NET Framework发布。 | ||
2004年9月30日 | 5(老虎Tiger) | 将产品版本号修改成了“JDK x”。
|
2006年12月11日 | 6(野马Mustang) | Sun公司终结了J2EE、J2SE、J2ME的产品线命名方式,启用Java EE 6、Java SE 6、JavaME 6的新命名来代替。
|
2006年11月13日,Java开源:Sun公司将JDK在“GPL v2”协议下公开了源码,并建立了“OpenJDK”组织对源码进行独立管理。 | ||
2009年2月19日 | 7 (海豚Dolphin) | 按照JDK 7最初的功能规划,一共会设置十个里程碑。最后一个里程碑版本原计划定于2010年9月9日结束,但由于各种原因,JDK 7最终无法按计划完成。
|
2009年4月20日,Oracle收购Sun公司,并分别从BEA和Sun手中取得了世界三大商用虚拟机的其中两个:“JRockit”和“HotSpot”。 | ||
2014年3月18日 | 8 | 从JDK 8开始,Oracle启用JEP(JDK Enhancement Proposals)来定义和管理纳入新版JDK发布范围的功能特性。
|
2017年9月21日 | 9 | 完成了7中预定的Jigsaw项目(虚拟机层面的模块化支持),增强了若干工具(JS Shell、JLink、JHSDB等),整顿了HotSpot各个模块各自为战的日志系统,支持HTTP 2客户单API等91个JEP。 |
2018年3月20日 | 10 | 这版本的主要研发目标是内部重构,诸如统一源仓库、统一垃圾收集器接口、统一即时编译器接口(JVMCI在JDK 9已经有了,这里是引入新的Graal即时编译器)等。 |
2018年3月,Oracle将Java EE所有权直接赠送给Eclipse基金会,并以“Jakarta EE”的名字存在。 | ||
2018年9月25日 | 11 | 这是一个LTS版本的JDK,包含17个JEP,其中有ZGC垃圾收集器这样的革命性的出现,也有把JDK 10中的类型推断加入Lambda语法这种可见的改进。
|
2019年2月,RedHat同时从Oracle手上接过OpenJDK 8和OpenJDK 11的管理权利和维护职责,成为JDK历史版本的维护者。 | ||
2019年3月20日 | 12 | 其中主要有Switch表达式、Java微测试套件(JMH)等新功能,最引人注目的特性无疑是加入了由RedHat领导开发的Shenandoah垃圾收集器。
Shenandoah作为首个由非Oracle开发的垃圾收集器,其目标又与Oracle在JDK 11中发布的ZGC几乎完全一致,两者天生就存在竞争。Oracle马上用实际行动抵制了这个新收集器,在JDK 11发布时才说应尽可能保证OracleJDK和OpenJDK的兼容一致,转眼就在OracleJDK 12里把Shenandoah的代码通过条件编译强行剔除掉,使其成为历史上唯一进入了OpenJDK发布清单,但在OracleJDK中无法使用的功能。 |
Java虚拟机家族
从1996年初Sun发布的JDK 1.0中包含的Sun Classic虚拟机到今天,曾经涌现、湮灭过许多或经典,或优秀,或有特色,或有争议的虚拟机实现:
- 但讨论最多的还是“HotSpot”;
虚拟机 | 描述 |
---|---|
Sun Classic/Exact VM | 虚拟机始祖 |
HotSpot VM | 武林盟主:
|
Mobile/Embedded VM | 小家碧玉:
|
BEA JRockit/IBM J9 VM | 天下第二:
|
BEA Liquid VM/Azul VM | 软硬合璧:
|
Apache Harmony/Google Android Dalvik VM | 挑战者:
|
Microsoft JVM 及其他 | 没有成功,但并非失败 |
展望Java技术的未来
无语言倾向
Graal VM被官方称为“Universal VM”和“Polyglot VM”,这是一个在HotSpot虚拟机基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用。 Graal VM可以无额外开销地混合使用这些编程语言,支持不同语言中混用对方的接口和对象,也能够支持这些语言使用已经编写好的本地库文件。
Graal VM的基本工作原理是将这些语言的源代码(例如JavaScript)或源代码编译后的中间格式(例如LLVM字节码)通过解释器转换为能被Graal VM接受的中间表示(Intermediate Representation,IR),譬如设计一个解释器专门对LLVM输出的字节码进行转换来支持C和C++语言,这个过程称为程序特化(Specialized,也常被称为Partial Evaluation)。Graal VM提供了Truffle工具集来快速构建面向一种新语言的解释器,并用它构建了一个称为Sulong的高性能LLVM字节码解释器。
新一代即时编译器
HotSpot虚拟机中含有两个即时编译器,分别是“编译耗时短但输出代码优化程度较低的客户端编译器”(简称为C1)以及“编译耗时长但输出代码优化质量也更高的服务端编译器”(简称为C2),通常它们会在分层编译机制下与解释器互相配合来共同构成HotSpot虚拟机的执行子系统。
自JDK 10起,HotSpot中又加入了一个全新的即时编译器:Graal编译器(来自于“Graal VM”)。Graal编译器是以C2编译器替代者的身份登场的,能够做比C2更加复杂的优化,如“部分逃逸分析”(PartialEscapeAnalysis),也拥有比C2更容易使用激进预测性优化(Aggressive Speculative Optimization)的策略,支持自定义的预测性假设等。
向Native迈进
在微服务架构的视角下,应用拆分后,单个微服务很可能就不再需要面对数十、数百GB乃至TB的内存,有了高可用的服务集群,也无须追求单个服务要7×24小时不间断地运行,它们随时可以中断和更新;但Java明显相悖于这些特点。
Substrate VM是在Graal VM 0.20版本里新出现的一个极小型的运行时环境,包括了独立的异常处理、同步调度、线程管理、内存管理(垃圾收集)和JNI访问等组件,目标是代替HotSpot用来支持提前编译后的程序执行。Substrate VM补全了Graal VM“Run Programs Faster Anywhere”愿景蓝图里的最后一块拼图,让Graal VM支持其他语言时不会有重量级的运行负担。
灵活的胖子
HotSpot的定位是面向各种不同应用场景的全功能Java虚拟机,这是一个极高的要求,仿佛是让一个胖子能拥有敏捷的身手一样的矛盾。而随着HotSpot开发团队持续地重构着HotSpot的架构,HotSpot虚拟机正逐渐变得更佳灵活。
语言语法持续增强
实战:自己编译JDK
获取源码 系统需求 构建编译环境 进行编译 在IDE工具中进行源码调试