Intro

Java Write once, run anywhere. Garbage Collector 自动回收分配多余内存;JDK 是 JRE 的超集提供编译器以及诊断等,JRE 只是一个运行环境只包含 JVM 以及 Java 类库。我们开发的 Java 的源代码,首先通过 Javac 编译成为字节码(bytecode),然后,在运行时,通过 Java 虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。所以很多说法表示 Java 是解释执行,但是其实在奥克兰 JDK 中的 Hotspot JVM 里其实包含 JIT编译器(Just In Time Compile 即时编译器)把经常运行的代码作为"热点 代码"编译与本地平台相关的机器码,并进行各种层次的优化。

Characteristic

泛型、Lambda 等语言特性;基础类库,包括集合、IO/NIO、网络、并发、安全等基础类库。对于我们日常工作应用较多的类库,面试前可以系统化总结一下,有助于临场发挥。深入理解 Java 虚拟机以及 JDK 的工作很重要,会在日后的工作中事半功倍,如编译器、运行时环境、安全工具、诊断和监控工具等。这些基本工具是日常工作效率的保证,对于我们工作在其他语言平台上,同样有所帮助,很多都是触类旁通的。

编译 Java 源码生成 “.class” 文件里面实际是字节码,而不是可以直接执行的机器码。Java 通过字节码和 Java 虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系统和硬件的细节,这也是实现“一次编译,到处执行”的基础。在运行时,JVM 会通过类加载器(Class-Loader)加载字节码,解释或者编译执行。在 Java 的 JIT 中我们分 client 编译模式和 server 编译模式一个为高效运行模式编译,一个为长久稳定模式编译。

JVM

在 JVM 运行的时候同样可以有很多选项,比如说指定“-Xint”,就是告诉 JVM 只进行解释执行不编译,还有一个“-Xcomp”参 数,这是告诉 JVM 关闭解释器,不要进行解释执行优化机器码后执行。但是目前最高效的模式莫属 JDK 在编译时就直接转化代码变成机器码,即所谓 AOT(Ahead-of-Time Compilation)编译器: Java 9 提供的直接将所有代码编译成机器码执行。

jaotc --output libHelloWorld.so HelloWorld.class
jaotc --output libjava.base.so --module java.base
java -XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so HelloWorld