第1讲 | 谈谈你对Java平台的理解?

JRE(Java Runtime Environment): Java 运行环境,包含了 JVM 和 Java类库,以及一些模块等。

JDK(Java Development Kit): JRE 的一个超集,提供了更多工具,比如编译器、各种诊断工具等。

Java 是解释执行”,这句话正确吗?

我们开发的 Java 的源代码,首先通过 Javac 编译成为字节码(bytecode),然后,在运行时,通过 Java虚拟机(JVM)内嵌的解析器将字节码转换为最终的机器码。但常见的JVM,都提供了JIT(Just-In-Time)编译器动态编译,JIT 能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行

Java 分为编译期和运行时,Javac 的编译,编译 Java 源码生成“.class”文件里面实际的是字节码,而不是可以直接运行的机器码。Java 通过字节码和 Java 虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系统和硬件细节,这也是实现"一次编译,到处执行"的基础。

在运行时,JVM 会通过类加载器(Class-Loader)加载字节码,解析或者编译执行。

JDK 8 实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)

Java 虚拟机启动时,可以指定不同的参数对运行模式进行选择。

  • -Xint : 只解析执行,不对代码进行编译
  • -Xcomp: 关闭解析器,不进行解析执行,最大优化级别。会导致JVM启动慢很多

还有一种新的编译方式,即所谓的 AOT(Ahead-of-Time Compliation),直接将字节码编译成机器码,避免了 JIT 预热等各方面的开销。
Oracle JDK 9 就引入了实验性的 AOT 特性,并且增加了新的 jaotc 工具。利用下面的命令把某个类或者某个模板编译成AOT库。

jaotc --output libHelloWorld.so HelloWorld.class
jaotc --output libjava.base.so --module java.base

然后,在启动时直接指定就可以了。

java -XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so HelloWorld

Java平台蓝图

image.png

你可能感兴趣的:(第1讲 | 谈谈你对Java平台的理解?)