美文网首页
Java的即时编译器

Java的即时编译器

作者: kopshome | 来源:发表于2018-10-14 16:19 被阅读0次

日常的所谓的Java编译, 一般指的是前端编译, 也就是javac编译, 将写的.java文件, 编译成.class文件, 这个过程里javac并不做性能优化, 只会做语法检查. 而相应的后端编译, 指的就是将字节码转换成在操作系统执行的机器码的过程. 这个过程中, Java采用的混合的办法, 包括解释执行和编译执行, 其中的编译执行, 就是所谓的即使编译器的作用. 这篇文章下面所指的编译, 主要就是指这个过程的编译.

分层编译模式

Hotspot虚拟机有多个即时编译器, C1(Client Compiler)和C2(Server Compiler). 当然最新的还有Graal即时编译器.

Java7之前, 对于启动性有较高要求的, 我们选择C1, 对应的参数为 -client. 对于性能要求比较高的, 使用 -server 来启动C2编译器.

Java7开始, 引入了分层编译的概念,对应参数-XX:+TieredCompilation, 它综合了C1的启动优势和C2巅峰性能优势. 分层编译将jvm的执行状态分为五个层次:

  • 解释执行
  • 执行不带profiling(例如JDK自带的hprof)的C1代码(C1生成的机器码)
  • 执行部分profiling的C1代码
  • 执行所有profiling的C1代码
  • 执行C2代码

一般C2代码的执行效率要高于C1 30%以上. 上面C1的三个层次, 当然是越来越慢的. 热点的代码会被C1编译, 然后再被C4编译.

Java8是默认开启了分层编译, 原来的参数-client 和 -server参数都无效, 如果关闭分层编译, jvm将直接采用C2. 如果你希望只用C1, 那么在开启分层编译时可以用参数-XX:TieredStopAtLevel=1, 这时,在解释执行后,直接由C1进行编译.

即时编译的触发

jvm是根据方法的调用次数和循环回边的执行次数来触发即时编译的. 那么什么是循环回边? 例如下面的代码:

public static void foo(Object obj) {
  int sum = 0;
  for (int i = 0; i < 10; i++) {
    sum += i;
  }
}

代码在执行时, 循环会一次次执行, 每结束一次循环, 回到下一次循环的起点继续执行, 而循环的两个边界, 就是循环回边. 在解释执行时, 每运行一次, jvm就会将该方法的循环回边计数器 +1. 如果是C1, 它也是在这加循环回边计数器的代码. 这个计数器是不做同步的, 所以数值不一定准确, 但是可以确定的是足够大就可以说明他是热点方法了.

当不启用分层编译的情况下, 方法的调用次数 + 循环回边的次数和超过-XX:CompileThreshold指定的值时, 就会触发即时编译(C1默认1500,C2默认10000).

当启动分层编译时, 参数-XX:CompileThreshold将会失效, 阀值的大小是动态的.

相关文章

  • Java - JIT即时编译

    Java - JIT即时编译 前端编译器 VS 后端编译器 前端编译器:javac 编译,在程序运行前,将 源文件...

  • JVM(4)解释器和即时编译器

    1、虚拟机运行模式 java是一种解释性编程语言,在Hotspot实现中,提供了解释器和即时编译器,即时编译器能将...

  • Java学习-程序编译与代码优化

    介绍 java代码编译器代表性的有三类前端编译器:我们熟知的javac就是前端编译器JIT编译器:即时编译器,如h...

  • Java的即时编译器

    日常的所谓的Java编译, 一般指的是前端编译, 也就是javac编译, 将写的.java文件, 编译成.clas...

  • JIT编译器概述

    即时(JIT)编译器是Java™运行时环境的组件,可提高运行时Java应用程序的性能。 Java程序由类组成,这些...

  • 理解jvm

    一、Java平台的结构图 即时编译器(JIT) 五、jvm结构 方法区(method area)类信息、常量、精通...

  • JIT(just-in-time) 即时编译

    JIT 简介 JIT 是 just in time 的缩写, 也就是即时编译编译器。使用即时编译器技术,能够加速 ...

  • 深入浅出 JIT 编译器

    JIT 简介 JIT 是 just in time 的缩写, 也就是即时编译编译器。使用即时编译器技术,能够加速 ...

  • 《深入理解Java虚拟机》十:早期(编译器)优化

    现在Java虚拟机团队把性能的优化集中到了后端的即时编译器.前期的优化,主要做了针对Java语言编码过程的优化措施...

  • Java虚拟机

    Java虚拟机的结构 运行时数据区域:方法区、Java堆、虚拟机栈、本地方法栈、程序计数器 执行引擎:即时编译器、...

网友评论

      本文标题:Java的即时编译器

      本文链接:https://www.haomeiwen.com/subject/dmttzftx.html