首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JVM进阶 -- 浅谈即时编译

概念 即时编译是用来提升应用运行效率的技术 代码会先在JVM上解释执行,之后反复执行的热点代码会被即时翻译成为机器码,直接运行在底层硬件上 分层编译 HotSpot包含多个即时编译器:C1、C2和Graal...内置profiling Java 8默认开启了分层编译,无论开启还是关闭分层编译,原本的-client和-client都是无效的 如果关闭分层编译JVM将直接采用C2 如果只想用C1,在打开分层编译的同时...3层的C1编译,然后再被4层的C2编译 如果方法的字节码数目较少(如getter/setter),并且3层的profiling没有可收集的数据 JVM会断定该方法对于C1和C2的执行效率相同 JVM会在...3层的C1编译后,直接选用1层的C1编译 由于1层是终止状态,JVM不会继续用4层的C2编译 在C1忙碌的情况下,JVM在解释执行过程中对程序进行profiling,而后直接由4层的C2编译 在C2忙碌的情况下...,方法会被2层的C1编译,然后再被3层的C1编译,以减少方法在3层的执行时间 触发JIT的条件 JVM是依据方法的调用次数以及循环回边的执行次数来触发JIT的 JVM将在0层、2层和3层执行状态时进行profiling

93120
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JVM笔记-后端编译与优化

    概述 前面分析了 JVM 的前端编译器 Javac,本文分析后端编译器:即时编译器(JIT 编译器)和提前编译器(AOT 编译器)。 其实二者都不是 JVM 必需的组成部分。...但是,后端编译编译性能的好坏、代码优化质量的高低,却是衡量一款商用 JVM 优秀与否的关键指标之一,也是其核心所在。 2....即时编译器 目前主流的两款商用 JVM(HotSpot、OpenJ9)中,Java 程序最初都是通过「解释器(Interpreter)」解释执行的,当 JVM 发现某个方法或代码块的执行特别频繁,就会认为它们是...为了提高热点代码的执行效率,JVM 会在「运行时」把这部分代码编译成本地机器码,并用各种手段去优化代码。运行时完成这个任务的后端编译器被称为「即时编译器」。...2.1.2 对比分析 目前主流的商用 JVM 内部都同时包含解释器与编译器,二者各有优势: 程序需要迅速启动和执行时,解释器可以省去编译时间,立即执行。

    62210

    JVM笔记-前端编译与优化

    概述 所谓”编译“,通俗来讲就是把我们写的代码“翻译“成机器可以读懂的机器码。而编译器就是做这个翻译工作的。...即时编译器:Just In Time Compiler,常称 JIT 编译器,在「运行期」把字节码转变为本地机器码的过程。比如 HotSpot VM 的 C1、C2 编译器,Graal 编译器。...提前编译器:Ahead Of Time Compiler,常称 AOT 编译器,直接把程序编译成与目标机器指令集相关的二进制代码的过程。...其中后面两类都属于后端编译器。 本文主要分析前端编译器 Javac 的相关内容,后文再介绍后端编译器。 2....JVM 其实并不支持这些语法,它们在编译阶段要被还原成原始的基础语法结构。该过程就称为解语法糖(打回原形)。 2.3.4 字节码生成 Javac 编译过程的最后一个阶段。

    46010

    JVM之早期(编译器)优化

    概述 JVM编译器可以分为三个编译器: 1. 前端编译器:把.java转变为.class的过程。如Sun的Javac、Eclipse JDT中的增量式编译器(ECJ)。 2....JIT编译器:把字节码转变为机器码的过程,如HotSpot VM的C1、C2编译器。 3. AOT编译器:静态提前编译器,直接将*.java文件编译本地机器代码的过程。...本节讲述的仅限于第一类编译过程 Javac编译器 Javac编译器本身是由Java语言编写的程序。 编译过程大致可以分为3个过程: 1. 解析与填充符号表过程。 2....编译期的数据及控制流分析与类加载时的数据及数据流分析的目的基本上是一致的,但校验范围有所区别,有一些校验项只有在编译期或者运行期才能进行。...如将局部变量声明为final,对运行期是没有影响的,变量的不变性仅仅由编译器在编译期间保障。

    39830

    深入理解jvm - 编译优化(下)

    前言 本文接上文的内容继续讲述:深入理解jvm - 编译优化(上) 概述 补充后端优化的另一项内容提前编译器的处理 介绍jvm的几项重点优化措施 「方法内联(重要)」 「逃逸分析(先进)」 「公共子表达式消除...(经典)」 「数组边界检查消除(语言经典)」 后端优化 提前编译器 提前编译器的历史其实已经很久了,但是在java领域知道andirod的崛起才被java关注,在讲解关于提前编译器的关注之前,我们来看下提前编译器的优劣...链接时优化:java天生支持即时编译产生本地代码。 关于提前编译的内容只需要基本了解即可。下面我们来看下关于jvm更多的底层优化。...底层优化 下面是关于jvm的底层优化内容,jvm的底层优化内容非常多,比如:方法内联、冗余重复消除、复写传播、无用代码消除等等。...写在最后 关于jvm的基本内容已经介绍完毕,下一节为总结内容。

    68910

    JVM系列五(javac 编译器).

    一、概述 我们都知道 *.java 文件要首先被编译成 *.class 文件才能被 JVM 认识,这部分的工作主要由 Javac 来完成,类似于 Javac 这样的我们称之为前端编译器; 但是 *.class...就需要 JVM 将 *.class 文件编译成机器码,这部分工作由JIT 编译器完成; 除了这两种编译器,还有一种直接把 *.java 文件编译成本地机器码的编译器,我们称之AOT 编译器。 ?...二、javac 的编译过程 首先,我们先导一份 javac 的源码(基于 openjdk8)出来,下载地址:https://hg.openjdk.java.net/jdk8/jdk8/langtools...从 Sun Javac 的代码来看,编译过程大致可以分为三个步骤: 解析和填充符号表过程 插入式注解处理器的注解处理过程 分析和字节码生成过程 这三个步骤所做的工作内容大致如下: ?...这三个步骤之间的关系和交互顺序如下图所示,可以看到如果注解处理器在处理注解期间对语法树进行了修改,编译器将回到解析和填充符号表的过程进行重新处理,直到注解处理器没有再对语法树进行修改为止。 ?

    94410

    深入理解jvm - 编译优化(上)

    概述 了解javac的基本编译过程以及基本的处理细节 了解基本的前端优化手段:语法糖和泛型的实现 了解前后端编译的内容以及部分后端编译的内容。...后端优化 即时编译器 即使编译器的重要地位自不用说,到现在还是主流编译器的Hotspot就可以说明即时编译器的重要性,而Hotspot里面一项重要的优化就是即使编译器,在了解即时编译器之前,我们需要弄清楚下面的问题...: 为什么解释器和即时编译器并存 为什么要多个编译器 什么时候用解释器,什么时候用即时编译器 哪些代码为本地代码,如何编译 外部如何观察结果 通过解决上面的问题,我们就可以大致了解即时编译的核心内容。...在Hotspot的编译器下有两个编译器: C1:客户端编译器:效率高,非常快,但是质量一般 C2:服务端编译器:质量高但是效率要低一些 编译器为什么不止一个还有多个,这又是有关历史的话题,在早期的工作模式下面...在后续的文章中我们介绍了部分后端编译优化的方式,即使编译器,以及热点代码探测,在即时编译里面我们讲述了分层编译的功能。最后我们用结构图讲述了编译的内容。

    41220

    JVM-12.即时编译

    HotSpot中的JIT编译器 1.1 编译器和解释器 HotSpot中有编译器和解释器并存。...HotSpot中内置两个JIT编译器: JVM根据自身版本和机器硬件性能自动选择 Client Compiler,简称C1,-client参数强制 Server Compiler,简称C2, -server...参数强制 解释器和编译器搭配使用成为混合模式(Mixed Mode) 用-Xint参数强制JVM运行与解释模式,全部用解释方式,编译器不介入 用-Xcomp强制JVM运行于编译模式,优先采用编译方式...分层编译:根据比那一起编译,优化的规模耗时,划分出不同的编译层次 第0层,程序解释执行,解释器不开启性能监测功能,触发第一层编译 第1层,也叫C1编译,将字节码编译为本地代码,进行简单, 可靠的优化,...1.3 编译过程 JVM默认情况下对于即时编译请求在编译完成之前,都按照解释方式执行,编译动作在后台线程执行 参数-XX:-BackgroundCompilation禁止后台编译,此时编译请求会等待,直到编译完成后直接执行本地代码

    67520

    Linux 内核】编译 Linux 内核 ⑤ ( 查看 .config 编译配置文件 | 正式编译内核 )

    文章目录 一、查看 .config 编译配置文件 二、正式编译内核 一、查看 .config 编译配置文件 ---- 在上一篇博客 【Linux 内核】编译 Linux 内核 ④ ( 打开 Linux...内核编译 菜单配置 |菜单配置中的光标移动与选中状态 | 保存配置 | 配置项帮助文档 ) 中 , 已经将编译配置保存到了 .config 文件中 ; 查看 .config 编译配置文件 , 在 linux...内核源码根目录中 , 执行 gedit .config 命令 , 查看 .config 编译配置文件 : ( 也可以使用 vi , vim 等文本编辑器查看 ) 在 .config 配置中 , #...等号右侧的 y 表示同意该操作 ; .config 文件内容示例 : 配置文件很多 , 这里只贴出一部分 ; # # Automatically generated file; DO NOT EDIT. # Linux...---- 在 Linux 内核源码根目录 , 执行 sudo make j4 开始编译 Linux 内核 ;

    12.2K40

    JVM第五卷---编译期处理

    JVM第五卷---编译期处理 编译期处理 默认构造器 自动拆装箱 泛型集合取值--泛型擦除 可变参数 foreach 循环 switch 字符串 switch 枚举 枚举类 try-with-resources...方法重写时的桥接方法 匿名内部类 插入式注解处理器 ---- 编译期处理 所谓的 语法糖 ,其实就是指 java 编译器把 *.java 源码编译为 *.class 字节码的过程中,自动生成 和转换的一些代码...,主要是为了减轻程序员的负担,算是 java 编译器给我们的一个额外福利(给糖吃 嘛) 注意,以下代码的分析,借助了 javap 工具,idea 的反编译功能,idea 插件 jclasslib 等工具...另外,编译器转换的结果直接就是 class 字节码,只是为了便于阅读,给出了 几乎等价 的 java 源码方式,并不是编译器还会转换出中间的 java 源码,切记。...即 代码片段1 都会在编译阶段被转换为 代码片段2 ---- 泛型集合取值–泛型擦除 泛型也是在 JDK 5 开始加入的特性,但 java 在编译泛型代码后会执行 泛型擦除 的动作,即泛型信息在编译为字节码之后就丢失了

    89420

    使用 JITWatch 查看 JVM 的 JIT 编译代码

    来源:刘正阳 , liuzhengyang.github.io/2017/07/27/jitwatch/ 背景 我们知道Java代码通过编译编译成字节码,一般是class文件,有JVM的各个类加载器加载后...,根据JVM的启动配置可以进行解释执行和编译执行,编译执行是由JIT(Just In Time)Compiler将字节码编译成本地代码来提高执行速度,缺点是编译本身会消耗时间并且会占用堆外空间(codecache...有时候我们想排查问题或者了解底层是如何实现的,就需要查看JIT编译后的汇编代码是什么样的,Hotspot提供了-XX:+PrintAssembly选项来输出编译后的汇编代码,缺点是输出日志量巨大,并且难以和代码中的对应起来...通过以下命令检测下是否安装成功 java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -version 启动一个应用,并且配置输出日志 在应用中添加如下JVM

    2.1K20

    JVM性能优化系列-(6) 晚期编译优化

    晚期编译优化 晚期编译优化主要是在运行时做的一些优化手段。...本文中提及的编译器、即时编译器都是指HotSpot虚拟机内的即时编译器。...6.2 HotSpot虚拟机内的即时编译器 解释器和编译器 HotSpot虚拟机采用解释器与编译器并存的架构,解释器与编译器两者各有优势: 当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间...由于即时编译编译本地代码需要占用程序运行时间,要编译出优化程度更高的代码,所花费的时间可能更长;而且想要编译出优化程度更高的代码,解释器可能还要替编译器收集性能监控信息,这对解释执行的速度也有影响。...编译对象与触发条件 在运行过程中会被即时编译编译的“热点代码”有两类: 被多次调用的方法 被多次执行的循环体 在这两种情况下,都是以整个方法作为编译对象,这种编译方式被称为栈上替换。

    24710

    JVM性能优化系列-(5) 早期编译优化

    早期编译优化 早期编译优化主要指编译期进行的优化。...java的编译期可能指的以下三种: 前端编译器:将.java文件变成.class文件,例如Sun的Javac、Eclipse JDT中的增量式编译器(ECJ) JIT编译器(Just In Time Compiler...):将字节码变成机器码,例如HotSpot VM的C1、C2编译器 AOT编译器(Ahead Of Time Compiler):直接把*.java文件编译成本地机器码,例如GNU Compiler for...5.1 javac编译器工作流程 Sun javac编译器的编译过程可以分为3个过程: 解析与填充符号表过程 插入式注解处理器的注解处理过程 分析与字节码生成过程 1....变长参数 Arrays.asList(1, 2, 3, 4, 5); 条件编译 条件编译也是java语言的一种语法糖,根据布尔常量值的真假,编译器将会把分支中不成立的代码块消除掉。

    25120
    领券