学习JVM原理-17.早期编译与运行时JIT编译

摘自《深入理解Java虚拟机》周志明著

虽有那种直接把*.java变成本地执行代码的编译器,但java的编译方式主要有两种:

  1. 前期编译:即SUN的javac, 把java编译成字节码; 运行时由解释器解释执行

  2. 运行时编译:JIT(Just in Time)编译器,运行时把Hot Spot(经常访问的代码)编译成本地代码执行(注意,JIT并不是JVM规范,有的JVM实现里没有JIT)

Java程序运行时就是 解释器 + JIT编译器 一起工作(你可以用-Xint禁止编译器)。解释器发现HotSpot后,如果已有对应的本地代码,就会让JIT执行这段代码;否则,会一边让JIT在后台编译,一边自己解释执行。有时JIT如果发现自己不能够执行本地代码,也会把任务交给解释器

另外,两种编译器都会做些优化动作:

  1.javac: 一个例子就是解除泛型这个语法糖,因为字节码是不认泛型的,List<String>在字节码里的类型就是List

  2.JIT: 比如内联

    

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.