浅析 JIT 即时编译技术

即时编译回顾

HotSpot 虚拟机执行 Java 程序时,先通过解释器对代码解释执行,发现某个方法或代码块执行比较频繁后,对热点代码进行编译,编译后生成与本地平台相关的机器码,再去执行机器码获得较高的运行效率。必要时,也会通过逆优化从即时编译回到解释执行,如编译器遇到罕见陷阱的情况。

在 Java 虚拟机规范中,并未要求虚拟机必须实现即时编译,但即时编译在主流的虚拟机中都有实现,后文所有讨论都基于 HotSpot 虚拟机。

即时编译器

HotSpot 虚拟机中有两个即时编译器,分别为 Client Compiler 和 Server Compiler,简称为 C1 编译器和 C2 编译器。C1 编译器占用内存小,进行局部优化,代码执行效率比 C2 编译器低,适用于客户端应用; C2 编译器占用内存大,进行全局优化,代码执行效率比 C1 编译器高,适用于服务端应用。在 JDK 1.7 以后的 HotSpot 虚拟机中,采用了被称为分层编译的策略,启动时解释执行提高启动速度,然后 C1 编译获取较好的编译速度,再 C2 编译获取较好的编译质量。

默认情况下,虚拟机会自动选择合适的编译器与解释器一起配合工作,用户也可以在启动参数里使用 “-client” 或 “-server” 来强制要求虚拟机使用某一种编译器。编译器与解释器一起配合工作的模式,被称为混合模式。用户也可以在启动参数里使用 “-Xint” 来要求虚拟机只使用解释器,使用 “-Xcomp” 来要求虚拟机只使用编译器。

被多次调用的方法和被多次执行的循环体,就是即时编译器关注的热点代码。在 HotSpot 中,采用了基于计数器的热点探测技术,为每个方法定义了两个计数器:方法调用计数器、回边计数器。

默认情况下,如果一段时间内方法调用计数器的值没有超过虚拟机设置的阈值,则在垃圾回收时计数器会热度衰减,数值减少 1/2,此时间范围又被称为半衰期。所以方法调用计数器中存储的实际上并不是方法调用的绝对次数。用户可以调整半衰期的值,甚至可以关闭热度衰减。

回边计数器则统计了循环体执行的绝对次数,它的阈值可以由方法调用计数器的阈值计算出来。如果回边计数器发生溢出,也会把方法调用计数器调整为溢出。

调用方法时,如果两个计数器之和超过了方法调用计数器的阈值,就会提交方法的编译请求。循环体执行时,如果两个计数器之和超过了回边计数器的阈值,也是编译代码块所在的方法,因为此时方法正在执行中,又被称为栈上替换,即替换方法时方法的栈帧还在栈上。

默认情况下,编译器在后台进行编译,即调用热点代码发现需要编译时,先以解释方式继续执行,向编译器发送编译请求,编译结束后下次调用时才使用编译的本地代码。用户也可以通过启动参数来要求虚拟机禁止后台编译,编译结束前热点代码的执行处于阻塞状态。

优化技术

HotSpot 虚拟机使用了很多种优化技术,这里只简单介绍其中的几种,完整的优化技术介绍可以参考官网内容。

公共子表达式消除:

如果一个表达式已经进行过计算,并且在下次用到之前依赖的变量没有变化,即表达式的计算结果不会发生变化,则在下次使用这个表达式时直接使用计算的结果。

数组边界检查消除:

在 Java 中访问数组时,会自动进行边界检查来防止数组下标越界。但是对于某些情况并不需要每次访问都去检查,如在一个循环中遍历数组元素,如果虚拟机能够确定下标不会发生越界并且优化确实能够提高运行速度,则虚拟机会去除每次访问的下标检查。

方法内联:

对于可以内联的方法,直接复制到调用者代码中,减少方法调用次数和性能消耗。

逃逸分析:

方法中定义的一个对象,如果会被其他方法访问则称为方法逃逸,如果会被其他线程访问则称为线程逃逸。对于不能逃逸的对象,HotSpot 虚拟机采用了栈上分配、同步消除、标量替换等方法进行优化。

每周 3 篇学习笔记或技术总结,面向有一定基础的 Java 程序员,内容涉及 Java 进阶、虚拟机、MySQL、NoSQL、分布式计算、开源框架等多个领域。关注作者或微信公众号 backend-develop 第一时间获取最新内容。

浅析 JIT 即时编译技术 | 后端开发那点事儿

时间: 2024-11-05 18:28:43

浅析 JIT 即时编译技术的相关文章

JVM中的 JIT 即时编译及优化技术

JVM Client 模式和 Server模式的区别 查看JVM模式 通过 java -version 可查看 JVM 所处的模式,并可以通过修改配置文件进行配置,那它们有什么区别呢? Server:-Server 模式启动时,速度较慢,但是启动之后,性能更高,适合运行服务器后台程序 Client:-Client 模式启动时,速度较快,启动之后不如 Server,适合用于桌面等有界面的程序 热点代码 理解 当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”. 热点代码

Java 即时编译 JIT

Java中的JIT class 编译成可执行的代码(原生型指令码) JIT Compiler(Just-in-time Compiler) 即时编译最早的Java建置方案是由一套转译程式(interpreter),将每个Java指令都转译成对等的微处理器指令,并根据转译后的指令先后次序依序执行,由于一个Java指令可能被转译成十几或数十几个对等的微处理器指令,这种模式执行的速度相当缓慢. 针对这个问题,业界首先开发出JIT(just in time)编译器.当Java执行runtime环境时,每

转:什么是即时编译(JIT)!?OpenJDK HotSpot VM剖析

重点 应用程序可以选择一个适当的即时编译器来进行接近机器级的性能优化. 分层编译由五层编译构成. 分层编译提供了极好的启动性能,并指导编译的下一层编译器提供高性能优化. 提供即时编译相关诊断信息的JVM开关. 像内联化和向量化之类的优化进一步增强了性能. OpenJDK HotSpot Java Virtual Machine被人亲切地称为Java虚拟机或JVM,由两个主要组件构成:执行引擎和运行时.JVM和Java API组成Java运行环境,也称为JRE. 在本文中,我们将探讨执行引擎,特别

即时编译和打包您的 Groovy 脚本(转)

在本文中将会涉及到: 使用 CliBuilder 来实现对命令行选项的支持,脚本执行时所需要的参数将通过命令行选项的方式传递. 使用 GroovyClassLoader 加载 Groovy class. 使用 AntBuilder 来构建 Jar 包. 开始之前 关于本文 也许您写了一些有趣或实用的 Groovy 脚本并希望与您的朋友分享,可是您并不想强迫他们安装 Groovy,所以您也许想要做一个小工具让您的朋友们能够用它编译您的 Groovy 脚本并且生成一个可执行的 Jar 包.本文将介绍

APK防反编译技术

APK防反编译技术 下载地址:地址 我们的APK实际上就是一个ZIP压缩文件,里面包含有一个classes.dex,我们编译后生成的程序代码就全部在那里了,通过apktool等工具可以轻松地将它们反编译成smali代码.有了这些反编译出来的smali代码之后,我们就可以轻松地了解别人的APK使用的一些技术或者直接修改别人的APK.由于这些APK反编译工具的存在,我们迫切地希望能有方法去防止别人来反编译我们的APK,从而保护自己的商业机密和利益. 下载地址:地址 版权声明:本文为博主原创文章,未经

android apk 防止反编译技术第一篇-加壳技术

做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习.现在将最近学习成果做一下整理总结.学习的这些成果我会做成一个系列慢慢写出来与大家分享,共同进步.这篇主要讲apk的加壳技术,废话不多说了直接进入正题. 一.加壳技术原理 所谓apk的加壳技术和pc exe的加壳原理一样,就是在程序的外面再包裹上另外一段代码,保护里面的代码不被非法修改或反编译,在程序运行的时候优先取得程序的控制权做一些我们自己想

android apk 防止反编译技术第二篇-运行时修改字节码

上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止apk反编译的技术-运行时修改字节码.这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创.下面我们来介绍一下这种方法. 我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时d

android apk 防止反编译技术第四篇-对抗JD-GUI

又到周末一个人侘在家里无事可干,这就是程序员的悲哀啊.好了我们利用周末的时间继续介绍android apk防止反编译技术的另一种方法.前三篇我们讲了加壳技术(http://my.oschina.net/u/2323218/blog/393372).运行时修改字节码(http://my.oschina.net/u/2323218/blog/396203)和伪加密(http://my.oschina.net/u/2323218/blog/399326),如果有不明白的可以查看我的博客的前三篇中关于这

新手入门:史上最全Web端即时通讯技术原理详解

前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM(相关文章请参见:<IM架构篇>.<IM综合资料>.<IM/推送的通信格式.协议篇>.<IM心跳保活篇>.<IM安全篇>.<实时音视频开发>).消息推送应用(参见:<推送技术好文>)的通信原理介绍也较多