![IG]R_A5HS`I0A5R@VIRT_7.jpg
![NK1CESPNE7PEN~%T6YCTZ5.png

解释器:
一条一条地读取 解释并且执行字节码指令
因为它一条一条地解释和执行指令 所以它可以很快地解释字节码 但是执行起来会比较慢
这是解释执行的语言的一个缺点 字节码这种“语言”基本来说是解释执行的
即时(Just-In-Time)编译器:
即时编译器被引入用来弥补解释器的缺点
执行引擎首先按照解释执行的方式来执行 然后在合适的时候 即时编译器把整段字节码编译成本地代码
然后执行引擎就没有必要再去解释执行方法了 它可以直接通过本地代码去执行它
执行本地代码比一条一条进行解释执行的速度快很多
编译后的代码可以执行的很快 因为本地代码是保存在缓存里的
简单理解JIT就是当代码中某些方法复用次数比较高的 并超过一个特定的值就成为了热点代码
那么这个这些热点代码就会被编译成本地代码(其实可以理解成缓存)加快访问速度
运行过程中会被即时编译器编译的热点代码有两类:
1)被多次调用的方法
2)被多次执行的循环体
这两种情况 编译器都是以整个方法作为编译对象
这种编译方法因为编译发生在方法执行过程之中 因此形象的称之为栈上替换(On Stack Replacement,OSR)
即方法栈帧还在栈上 方法就被替换了

如何判断热点代码呢

要知道方法或一段代码是不是热点代码 是不是需要触发即时编译 需要进行Hot Spot Detection(热点探测)
目前主要的热点探测方式有以下两种:
1)基于采样的热点探测
采用这种方法的虚拟机会周期性地检查各个线程的栈顶 如果发现某些方法经常出现在栈顶 那这个方法就是“热点方法”
这种探测方法的好处是实现简单高效 还可以很容易地获取方法调用关系(将调用堆栈展开即可)
缺点是很难精确地确认一个方法的热度 容易因为受到线程阻塞或别的外界因素的影响而扰乱热点探测
2)基于计数器的热点探测
采用这种方法的虚拟机会为每个方法(甚至是代码块)建立计数器 统计方法的执行次数
如果执行次数超过一定的阀值 就认为它是“热点方法”
这种统计方法实现复杂一些 需要为每个方法建立并维护计数器
而且不能直接获取到方法的调用关系 但是它的统计结果相对更加精确严谨
JVM主要的功能:
1)ClassLoader装载class文件
2)解释字节码并执行
3)运行期间内存分配 垃圾回收

FRBT2_T5_}1P520V0}CAOOH.jpg
**