JVM编译优化-即时编译器(JIT)-阿里云开发者社区

开发者社区> 艾贺> 正文

JVM编译优化-即时编译器(JIT)

简介: Java语言的“编译期”,可能指的是一个前端编译期,把*.java文件转变为 *.class文件的过程;也可能是虚拟机的后端运行期编译器(JIT)把字节码转变为机器码的过程,还可能是指使用静态编译器(AOT编译器,Ahead Of Time Compiler)直接把 java文件编译成本地机器码的过程。
+关注继续查看

Java语言的“编译期”,可能指的是一个前端编译期,把*.java文件转变为 *.class文件的过程;也可能是虚拟机的后端运行期编译器(JIT)把字节码转变为机器码的过程,还可能是指使用静态编译器(AOT编译器,Ahead Of Time Compiler)直接把 java文件编译成本地机器码的过程。

编译期很广,我们这里讨论即时编译器,因为即使编译器,以下简称JIT,JIT在运行期的优化过程对于程序的运行更加重要。

JIT简介

Java程序最初是通过解释器来解释执行的,当虚拟器发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”,为了提高热点代码的执行效率,在运行时,虚拟机会把这些代码编译为机器码,并进行各种层次的优化,完成这个任务的编译器成为即使编译器(JIT)。

简单说就是热点代码会被进行优化。

img_cf70a0c14954de946e68f1b9adb0ba90.png
image.png

什么是热点代码?

  • 被多次调用的方法:方法调用的多了,代码执行次数也多,成为热点代码很正常。
  • 被多次执行的循环体:假如一个方法被调用的次数少,只有一次或两次,但方法内有个循环,一旦涉及到循环,部分代码执行的次数肯定多,这些多次执行的循环体内代码也被认为“热点代码”

如何检测热点代码?

判断一段代码是不是热点代码,是不是需要触发JIT,这样的行为成为热点探测,主要方式有两种。

  • 基于采样的热点探测:采样,指把时间域或空间域的连续量转化成离散量的过程,也就是取一部分,周期性的检查线程的栈顶,如果发现某些方法经常出现在栈顶,即热点方法。

    缺点:不够精确,容易受到线程阻塞或外界因素的影响
    优点:简单,高效

  • 基于计数的热点探测(HotSpot虚拟器默认):为每个方法甚至是代码块建立计数器,统计执行次数,如果执行次数超过一定阈值就认为是热点代码。

    缺点:实现麻烦
    优点:统计结果精确

HotSpot虚拟器为每个方法准备了两类计数器:方法调用计数器和回边计数器,两个计数器都有一定的阈值,超过阈值就会触发JIT.

-XX:CompileThreshold 可以设置阈值大小,Client 编译器模式下,阈值 默认的值 1500,而 Server 编译器模式下,阈值 默认的值则是 10000。

编译器优化

当JVM编译代码时,它会将汇编指令保存在代码缓存,代码缓存具有固定大小,一旦它被填满,JVM将不能编译更多的代码。

–XX:ReservedCodeCacheSize 选项去增加代码缓存的大小。

查看编译日志

JVM启动时,-XX:+PrintCompilation,它会报告什么时候代码缓存满了,以及什么时候编译停止了。

另外可以通过jstat来查看编译器信息。

jstat -compile JVM进程ID
  ~ jstat -compiler 56067
Compiled Failed Invalid   Time   FailedType FailedMethod
     968      0       0     0.80          0

最后

Java语言编译优化包含很多内容,这次主要围绕JIT即时编译器周边来说,希望能帮助到大家。

参考

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Greenplum ORCA 优化器的编译安装与使用
背景 ORCA 是PostgreSQL的下一代优化器,在QUERY的优化上比自带的优化器有长足的进步。 安装ORCA cmake wget https://cmake.org/files/v3.5/cmake-3.5.2.tar.gz tar -zxvf cmake-3.5.2.tar
9914 0
降低Cache失效率--编译器优化
PS<<EOF 之前看了酷壳上 @我的上铺叫路遥 投稿的"七个示例科普CPU Cache",其实没认真看完! 丫的,我翻阅了一下《计算机系统结构》的书,把cache那章阅读了下! 发现了新大陆,对自己当时学到的知识的领悟和体会似乎有了新的感受!计算机专业课,其实我都挺认真的学过的,哈哈,只不过...... 我把我觉得有用的摘录下!! 为什么好多那么些开源滴优秀滴代
1547 0
LLVM每日谈之十一 编译器相关学习资料推荐
作者:snsn1984 近来碰到一些想学习LLVM但是已经把编译原理的知识还给老师的朋友,让帮忙推荐一些学习资料,我就把手头有的一些资料,大都是自己读过的一些资料整理一下,列出来,希望对大家有所帮助。
917 0
Angular 2 中的编译器与预编译(AoT)优化
### Compilation in Angular 从`源代码`到`浏览器中可运行的程序`之间的过程都可以被认为是Compile过程,在Angular程序中,源代码中可能包含@Directive、@Component、@NgModule、@Pipe等各种内容,无论是TypeScript的Annotation还是Template中的double binding,这些最后都会变成可被浏览器解析
4959 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4485 0
不要做优化了!让编译器去干吧!
我们日常写代码时,经常自己去做一些优化,其实绝大多数情况都是没必要的,因为编译器比你想的聪明太多! 下面这个例子就是明证, 这个是一个求竭诚的递归写法,很多老手都会告诉你这样写性能低,应该用循环。
730 0
JVM深入学习笔记一:Java 编译器初探
<p>闲来无事想大概看下Java编译器的执行过程</p> <p><br></p> <p><strong>一、 编译一个文件</strong></p> <p>首先去搞到源代码。从JDK6开始Java代码开源,放到OPENJDK组织中去,所以从这个网站进行下载:</p> <p><a target="_blank" href="http://hg.openjdk.java.net/jdk
1282 0
JIT 编译器快速入门
本文讲的是JIT 编译器快速入门,JavaScript 刚面世时运行速度是很慢的,而 JIT 的出现令其性能快速提升。那么问题来了,JIT 是如何运作的呢?
1395 0
+关注
艾贺
专注开发,架构知识
248
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载