这篇文章上次修改于 1904 天前,可能其部分内容已经发生变化,如有疑问可询问作者。 >说起java平台,最多的是跨平台,一次编译,到处运行。java代码用javac编译成bytecode 的class文件,然后运行时,解释器转换成最终的机器码。JIT会把热点代码编译执行,而不是解释执行。 1.类加载器,Bootstrap,Application,Extension class loader,参考周志明《深入理解java虚拟机》。经过加载,验证,链接,初始化。 2.常见的垃圾收集器,SerialGC,Parallel GC,CMS,G1 3.java分为编译期和运行时。 + 编译生成的.class文件是平台无关的,会屏蔽具体的硬件细节和操作系统细节,这是“一次编译,到处运行”的基础 + 运行时,通过类加载器Class Loader加载字节码(.class)文件。可以解释加载也可以编译加载。jdk 8 默认的是混合模式,即java运行指令-Xmixed,但是Client模式和Server模式有明显的区别 - client模式以启动快速为目的,启动时 会进行1500次(上限)调用来进行编译。这里的JIT是C1 - Server模式以长时间运行为目的,启动时 会进行上万次调用,来确定搞笑的编译,这里的JIT是C2,C2默认采用所谓的分层编译TieredComplilation - 当然可以再运行时指定-Xcomp,告诉jvm关闭解释器,编译运行,但这种未必是最搞笑的,而且启动会慢很多 - 也可以指定-Xint,只解释运行 - 除了编译和解释,还有一种aot模式(oracle jdk 9引入),将某个模块编译成机器代码,可以减少启动预热开销,使用jaotc工具来使用.注意分层编译可以和AOT一起使用,不是非此即彼的。 ```java jaotc --output libHelloWorld.so HelloWorld.classs java -XX:AOTLibrary=./libHelloWorld.so HelloWorld ```
没有评论