一.学习目标java
1.了解解释器与编译器的概念与做用。数组
2.知道jvm中三种执行模式。缓存
3.了解热点代码。markdown
二.解释器模式与编译器模式以及混合模式app
字节码文件经过类装载器装载,被分配被分配到JVM的运行时数据区,而后会被执行引擎执行。执行引擎以指令为单位读取Java字节码。它就像一个CPU同样,一条一条地执行机器指令。每一个字节码指令都由一个1字节的操做码和附加的操做数组成。执行引擎取得一个操做码,而后根据操做数来执行任务,完成后就继续执行下一条操做码。将人能读懂的字节码文件转化为jvm能够读懂执行的语言,在jvm中经过三种方式经行转化,即解释器模式,JIT编译器模式,混合模式。jvm
1.解释器模式学习
一条一条地读取,解释而且执行字节码指令。由于它一条一条地解释和执行指令,因此它能够很快地解释字节码,可是执行起来会比较慢,没有JIT的配合下效率不高。优化
2.JIT编译器模式url
即时编译器把整段字节码不加筛选的编译成机器码不论其执行频率是否有编译价值,在程序响应时间的限制下,没有达到最大的优化。spa
3.混合模式
在解释执行的模式下引入编译执行,恰好能够弥补相互的缺点,达到更优的效果。
程序刚开始启动的时候,由于解释器能够很快的解释字节码,因此首先发挥做用,解释执行Class字节码,在合适的时候,即时编译器把整段字节码编译成本地代码,而后,执行引擎就没有必要再去解释执行方法了,它能够直接经过本地代码去执行它。执行本地代码比一条一条进行解释执行的速度快不少,主要缘由是本地代码是保存在缓存里的。
混合模式下其各自的特色主要以下:
解释器:
JIT编译器:
三.热点代码
在刚开始的时候,jvm不知道这段代码,是否会频繁的调用方法,或是一个循环,也就是这段代码被屡次执行,所以刚开始的时候并不会编译代码,将代码翻译成 java 字节码相对于编译这段代码并执行代码来讲,要快不少。编译器回去衡量哪些方法会被频繁调用,若是一个方法的执行频率超过一个特定的值的话,那么这个方法就会被JIT编译成本地代码。而这个方法或代码块因其运行特别频繁,就会认为这是“热点代码”(Hot Spot Code)。当 JVM 执行某一方法或遍历循环的次数越多,就会更加了解代码结构,那么 JVM 在编译代码的时候就作出相应的优化。
热点代码分为二类:
检测热点代码:
当计数器数值大于默认阈值或指定阈值时,方法或代码块会被编译成本地代码。
四.总结
如上图能够看出,整个java应用程序的执行过程以下:
一、源代码经javac编译成字节码,class文件
二、程序字节码通过JIT环境变量进行判断,是否属于“热点代码”(屡次调用的方法,或循环等)
三、如是,走JIT编译为具体硬件处理器(如sparc、intel)机器码
四、如否,则直接由解释器解释执行
参考资料:
https://blog.csdn.net/sinat_37138973/article/details/78438806