JIT是什么东西 分分钟打下来!

先了解下背景
有点丑 缺少设计细胞 凑合凑合看吧
   大家好!又来给大家分享干货了!今天就简简单单把JIT打下来。

Java具有强大跨平台能力,是由于JVM为我们屏蔽了操作系统和硬件层面的差异,我们看下上图,编写的 .Java 文件经过第一次编译(这里称之为第一次编译以区分即时编译)成 .class 字节码文件,该字节码文件为JVM能够识别的文件,通过类加载器将字节码加载到JVM内存,进一步实现类加载的全过程(加载、链接、初始化),当Java运行时,将字节码的内容通过解释器翻译为硬件能够识别的机器码并执行,因此解释器的作用就是读取字节码指令翻译为机器码,并执行这三个步骤,这是我们会发现,如果相同的代码块或者方法反复读取和翻译为机器码反复被执行,是对资源的浪废,并且耗时.因此,JIT(即时编译器)应运而生。

什么是JIT(Just-In-Time)?
当虚拟机发现某个方法或者代码块运行的特别频繁,就会将这些代码认定为热点代码,为了提升热点代码的执行效率,在运行时,虚拟机将这些代码编译(第二次编译)成本地机器码.(这里是将字节码转换为机器码),缓存起来,以尽各种手段尽可能的进行代码优化,运行时,完成这个任务的后端编译器称之为即时编译器,即JIT。

解释器与即时编译器

  那是不是有了JIT,就不需要解释器了呢?

程序需要迅速启动或者运行时,解释器首先发挥作用,省去编译的时间,立即运行,随着时间的推移,编译器发挥作用将越来越多的代码编译成本地代码(机器码).
为什么编译器要随着时间的推移才发挥作用呢?
我认为是有两点,第一,毕竟内存是有限的资源,随着时间的推移才能发现热点代码?对JVM sever模式,代码执行上万次才称之为热点代码,第二解释器为编译器收集性能监控信息为编译器编译优化提供了依据.
总之,解释器在java运行时翻译执行,节约内存,而JIT将热点代码编译并缓存,提升执行效率,两者配合完成到机器码的转换执行。
解释器与JIM混合使用的时候,成为Mixed模式,当然也可以通过启动参数-Xint或-Xcomp来控制解释编译模式.通过java -version可以查看虚拟机的默认启动模式。

即时编译器的种类
Java内置了两款即时编译器,客户端编译器(c1编译器)和服务端编译器(c2编译器),c1适用于启动速度敏感的应用,比如桌面应用.c2适用于长时间运行的服务端应用.在JDK7默认启用分层编译,两者配合工作,用c1有更高的编译速度,用c2有更好的编译质量.

  写的不咋滴 就凑合凑合看吧 觉得不行的 有能耐自己写 bbll的话就不要说了 技术有限

你可能感兴趣的:(JIT是什么东西 分分钟打下来!)