1.Java技术体系
从广义上讲,Kotlin、Clojure、JRuby、Groovy等运行于Java虚拟机上的编程语言及其相关的程序 都属于Java技术体系中的一员。
如果仅从传统意义上来看,JCP官方[1]所定义的Java技术体系包括了以 下几个组成部分:
- Java程序设计语言
- 各种硬件平台上的Java虚拟机实现
- Class文件格式
- Java类库API
- 来自商业机构和开源社区的第三方Java类库
JDK(Java Development Kit):是用于支持Java程序开发的最小环境,Java程序设计语言、Java虚拟机、Java类库这三部分的统称。
JRE(Java Runtime Environment):是支持Java程序运行的标准环境,Java类库API中的Java SE API子集[3]和Java虚拟机这两部分的统称。
Java技术体系所包括的内容2.JVM家族
- 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及其他
3.Java技术未来
- 无语言倾向
在HotSpot虚拟机基础上增强而成 的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用,这里“任何语言”包括了Java、Scala、 Groovy、Kotlin等基于Java虚拟机之上的语言,还包括了C、C++、Rust等基于LLVM的语言,同时支 持其他像JavaScript、Ruby、Python和R语言等。Graal VM可以无额外开销地混合使用这些编程语言, 支持不同语言中混用对方的接口和对象,也能够支持这些语言使用已经编写好的本地库文件。
Graal VM的基本工作原理是将这些语言的源代码(例如JavaScript)或源代码编译后的中间格式 (例如LLVM字节码)通过解释器转换为能被Graal VM接受的中间表示,这个过程称为程 序特化(Specialized,也常被称为Partial Evaluation)。从更严格的角度来看,Graal VM才是真正意义上与物理计算机相对应的高级语言虚拟机,理由是 它与物理硬件的指令集一样,做到了只与机器特性相关而不与某种高级语言特性相关。
-
新一代即时编译器
即时编译,热点代码会被HotSpot的探测机制准确定位捕 获,并将其编译为物理硬件可直接执行的机器码,在这类应用中Java的运行效率很大程度上取决于即 时编译器所输出的代码质量。
HotSpot虚拟机中含有两个即时编译器,分别是编译耗时短但输出代码优化程度较低的客户端编译 器(简称为C1)以及编译耗时长但输出代码优化质量也更高的服务端编译器(简称为C2)。
自JDK 10起,HotSpot中又加入了一个全新的即时编译器:Graal编译器,Graal编译器是C2编译器替代者,Graal编译器本身就是由Java语言写成,在保 持输出相近质量的编译代码的同时,开发效率和扩展性上都要显著优于C2编译器。
使用-XX:+UnlockExperimentalVMOptions-XX:+UseJVMCICompiler参数来启用Graal编译器。 -
向Native迈进
这里有提到提前编译,它是相对于即时编译的概念,提前编译能带来的最大好处是Java虚拟机加载这些已经预编 译成二进制库之后就能够直接调用,而无须再等待即时编译器在运行时将其编译成二进制机器码。理 论上,提前编译可以减少即时编译带来的预热时间,减少Java应用长期给人带来的“第一次运行慢”的 不良体验,可以放心地进行很多全程序的分析行为,可以使用时间压力更大的优化措施。
提前编译的坏处也很明显,它破坏了Java“一次编写,到处运行”的承诺,必须为每个不同的 硬件、操作系统去编译对应的发行包;也显著降低了Java链接过程的动态性,必须要求加载的代码在 编译期就是全部已知的,而不能在运行期才确定,否则就只能舍弃掉已经提前编译好的版本,退回到 原来的即时编译执行状态。 -
灵活的胖子
HotSpot的定位是面向各种不同应用场景的全功能Java虚拟机。 -
语言语法持续增强
网友评论