jvm的解释执行与编译执行

1、原理

  字节码无法直接交给硬件执行需要虚拟机翻译成机器码才能执行,“翻译”的策略有两种:解释执行和编译执行又称即使编译(JIT)。解释执行是没执行一句字节码的时候把字节码翻译成机器码并执行,优点是启动效率快,缺点是整体的执行速度较慢。编译执行预先把所有机器码编译成字节码并一起执行,其特点与解释执行相反,启动较慢执行较快。

  在jvm虚拟机中是两者混合出现,既有解释执行也有编译执行。首先是解释执行,一条条执行所有字节码,如果JVM发现某个方法被频繁的调用会把该方法用编译执行的策略编译好,下次执行的时候直接调用机器码,这种方法被称为热点方法,由此可见编译执行是以方法为单位。

  从业务的角度而言服务端和用户端对代码的执行速度和启动速度的要求是不一样的。比如移动端的应用程序,用户希望程序启动速度较快,服务端的程序,可能对程序的执行速度有更高的要求,为此从java7开始HotSpot采用了分层编译的方式,即引入了两种即使编译器:C1 C2。C1编译器称为client编译器,面向对启动性能有要求的用户端,编译时间段,优化策略简单;C2称为Serve驳岸一起面向对峰值性能有要求的服务器端,编译时间长,优化策略复杂。具体的在编译热点方法的时候先采用C1编译器,热点方法中的热点方法会被C2编译器再次编译。

2、JVM相关参数

  • -XX:CICompilerCount=n 指定JIT编译器用来编译方法的线程数量

  • -XX:CompileThreshold=n 指定一个方法的调用次数,以使HotSpot和JIT 编译器能编译它

  • -Xcomp 指定JVM在第一次使用时把所有的字节码编译成本地代码. (即CompileThreshold=1)

  • -Xbatch 在前台编译方法,直到编译完成方法才能执行

  • -Xint 仅仅使用解释模式,不激活JIT编译器 (即CompileThreshold=0)

上一篇:[python]数据整理,将取得的众多的沪深龙虎榜数据整一整


下一篇:loganalyzer