Java技术体系所包括的内容
1995年5月23日,Oak语言改名为Java,并在SunWorld大会上正式发布Java1.0版本。Java语言第一次提出了"Write Once , Run Anywhere"的口号。 1996年1月23日,JDK1.0发布,Java语言有了第一个正式版本的运行环境。 2018年3月,Oracle正式宣告JavaEE成为历史名词,所有权直接赠送给Eclipse基金会,唯一的条件是以后不准再使用“Java”这个商标,所以取而代之的将是Jakarta EE。
最大的争议点是Oracle要求包名中不能出现java字样,导致一堆javax.*开头的包一旦修改或添加新代码,就必须重新命名。
OrcaleJDK/OpenJDK使用的是HotSpot虚拟机。
Oracle从JDK11起,把以前的商业特性全部开源给OpenJDK,这样OpenJDK11和Oracle11的代码和功能,在本质上就是完全相同的。然后,Oracle宣布以后将会同时发行两个JDK:一个是以GPLv2+CE协议下发行的OpenJDK,另一个是在新的OTN协议下由Oracle发行的传统的OracleJDK。这两个JDK共享绝大部分源码,在功能上几乎是一样的,核心差异是前者可以免费在开发、测试或生产环境中使用,但是只有半年时间的更新支持;后者个人依然可以免费使用,但若在生产环境中商用就必须付费,可以有三年时间的更新支持。
HotSpot
HotSpot虚拟机的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知即时编译器以方法为单位进行编译。如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准即时编译和栈上替换编译行为。
通过编译器与解释器恰当地协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无需等待本地代码输出才能执行程序,即时编译的时间压力也相对减小,这样有助于引入更复杂的代码优化技术,输出质量更高的本地代码。
到了2014年的JDK8时期,里面的HotSpot就是与BEA JRockit相融合的结果,HotSpot在这个过程中移除掉永久代,吸收了JRockit的Java Mission Control监控工具等功能。
HotSpot虚拟机中含有两个即时编译器,分别是编译耗时短但输出代码优化程度较低的客户端编译器(简称为C1)以及编译耗时长但输出代码优化质量也更高的服务端编译器(简称为C2),通常它们会在分层编译机制下与解释器互相配合来共同构成Hotspot虚拟机的执行子系统。
自JDK10起,HotSpot中又加入了一个全新的即时编译器:Graal编译器,它是以C2编译器替代者的身份登场的。C2是由C++写成的编译器,而比C++足足晚20年面世的Graal编译器借鉴了C2的优点,由Java语言写成,有着极其充沛的后发优势。在保持输出相近质量的编译代码的同时,开发效率和扩展性上都要显著优于C2编译器。
Graal编译器能够做到比C2更复杂的优化,如“部分逃逸分析”,也拥有比C2更容易使用激进预测性优化的策略,支持自定义的预测性假设等。