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 的 解释执行与 编译执行的主要内容,如果未能解决你的问题,请参考以下文章

JVM执行引擎篇(解释器与编译器)

JVM - JIT即时编译器

JVM解释器与JIT编译器如何并存?

JVM原理与内存模型

运行机制和JVM

JVM--12---执行引擎----解释器JIT 编译器