jvm 的 解释执行与 编译执行
Posted 猎人在吃肉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm 的 解释执行与 编译执行相关的知识,希望对你有一定的参考价值。
1、原理
字节码无法直接交给硬件执行需要虚拟机 翻译 成 机器码 才能执行,“翻译”的策略有两种:解释执行
和 编译执行
,又称 即时编译(JIT)。
-
解释执行
,- 以解释方式运行字节码,
- 解释执行的意思是 读一句,执行一句。
优点是 启动效率快,
缺点是 整体的执行速度较慢。 -
编译执行
,- 将字节码编译成机器码
- 直接执行机器码
- 运行时编译
- 编译后,性能有数量级的提升。
其特点与解释执行相反,启动较慢,执行较快。
在jvm虚拟机中是两者混合出现,既有解释执行也有编译执行。首先是 解释执行,一条条执行所有字节码,如果JVM发现某个方法被频繁的调用会把该方法用编译执行的策略编译好,下次执行的时候直接调用机器码,这种方法被称为 热点方法,由此可见,编译执行 是以方法为单位。
从业务的角度而言,服务端和用户端对代码的执行速度和启动速度的要求是不一样的。
比如,移动端的应用程序,用户希望程序启动速度较快。
服务端的程序,可能对程序的执行速度有更高的要求。
为此,从 java7 开始, HotSpot 采用了分层编译的方式,即引入了两种即使编译器:C1、C2。
C1编译器,称为 client 编译器,面向对启动性能有要求的用户端,编译时间段,优化策略简单;
C2,称为Serve 编译器,对峰值性能有要求的服务器端,编译时间长,优化策略复杂。
具体的在编译热点方法的时候,先采用C1编译器,热点中的热点方法会被C2编译器再次编译。
2、JVM相关参数
-Xint : 解释模式,不激活JIT编译器 (即CompileThreshold=0)。
-Xcomp :编译模式, 指定JVM在第一次使用时把所有的字节码编译成本地代码。(即CompileThreshold=1)。
说明:comp:Compile
-Xmixed : 混合模式执行,-Xint
、-Xcomp
两个混合使用,即解释模式 和 编译模式 混合使用。
-Xbatch : 在前台编译方法,直到编译完成方法才能执行。
-XX:CICompilerCount=n : 指定JIT编译器用来编译方法的线程数量。
-XX:CompileThreshold=n : 指定一个方法的调用次数,以使HotSpot和JIT 编译器能编译它。
3、JVM 的三种模式
int模式: 用 -Xint
开启,即 解释模式, 在这种模式下全部采取解释模式运行。
comp模式: 用 -Xcomp
开启,这种模式下通知JVM关闭 解释模式 , 采用 编译模式 运行。但往往导致无法得到良好的自动优化。
mixed模式: 用 -Xmixed
开启,即混合运行模式,也是Hotspot的默认模式。
以上是关于jvm 的 解释执行与 编译执行的主要内容,如果未能解决你的问题,请参考以下文章