-
通常把java分为编译期和运行期, 但此处的编译和c语言的编译意义不同, javac的编译是将java源码编译为".class"字节码文件, 而不是可以直接执行的机器码. 在运行时,JVM通过class-loader加载字节码, 然后再解释或者编译执行
-
jdk8实际是解释和编译混合的模式 提供了JIT(just in time)编译器即动态编译器, 可在运行时将热点代码编译成机器码, 该情况下热点代码就属于编译执行而非解释执行了
-
jvm启动时.
指定"-Xint" 即告诉jvm只进行解释执行(逐条读入,逐条解释运行),这种模式抛弃了JIT可能带来的性能优势.
指定"-Xcomp" 告诉jvm关闭解释器,不进行解释执行,或者叫做最大优化级别. 但这种模式会导致jvm启动变慢非常多
此外还有一种新的编译方式: AOT(Ahead-of-TIme Compilation),直接将字节码编译为机器码, 这样可避免JIT预热等方面的开销, 如Oracle jdk9, 就增加了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
网友评论