编译器优化机制详解

本文深入介绍了Java的编译执行和解释执行,重点讲解了HotSpot虚拟机的即时编译器C1和C2,以及分层编译的概念。C1注重启动速度,C2则关注全局优化。文章还讨论了如何找到热点代码,通过基于采样和计数器的热点探测技术。
摘要由CSDN通过智能技术生成

学习 JVM 相关的知识,必然绕不开即时编译器,因为它太重要了。了解了它的基本原理及优化手段,在编程过程中可以让我们有种打开任督二脉的感觉。比如,很多朋友在面试当中还会遇到这样的问题:Java是基于编译执行还是基于解释执行?当你了解了Java的即时编译器,不仅能够轻松回答上述问题,还能如数家珍的讲出JVM在即时编译器上采用的优化技术,而且在实践过程中更深刻的理解代码背后的原理。

字节码是如何运行的

先来探讨字节码是如何运行的。众所周知,Java 有两种运行模式。第一种叫解释执行,所谓解释执行,它是由解释器一行一行的去翻译执行的。第二种叫编译执行,编译执行它会把字节码编译成机器码,然后去执行机器码。下面我们来对比一下解释执行和编译执行。

解释 VS 编译

解释执行的优势在于没有编译的等待时间,但是它的性能相对会差一些,因为一行一行的去翻译,性能可想而知,不会很高。

那么编译执行的优势在于运行效率会高很多。一般认为它比解释执行会快一个数量级。但是编译执行也不是十全十美的,它带来了额得开销,比如额外的内存开销,CPU 开销等等。

那么怎么样查看自己的 Java 是解释执行还是编译执行的呢?非常简单,只需要用 java -version 命令就可以了。

image.png

在这里有一个 mixed mode 表示混合模式,也就是部分代码解释执行,部分代码编译执行。

可以使用 -Xint,把 JVM 的执行模式设置成解释执行模式。

image.png

如果你想让你的 Spring boot 的项目以解释执行运行的话,那么只要执行 java -xint -version -xxx.jar 就可以了。

可以使用 -Xcomp,让 JVM 优先以编译模式运行。对于不能编译的代码会继续以解释模式运行。

image.png

还可以 -Xmixed,让 JVM 以混合模式运行。默认情况下就是混合模式。

那么一般情况下我们的代码一开始就是由解释器解释执行的。但虚拟机发现某一个方法或者是代码块运行的特别频繁的时候,就会认为这些代码是热点代码。这里大家可以留一个疑问,怎么样找到这些热点代码呢,一会儿来揭晓。

为了提高热点代码的执行效率,就会用即时编译器,也就是平时我们说的 JIT,去把这些热点代码编程和本地平台相关的机器码。并且会执行各种层次的优化。这里本地平台有多种层次的含义,比如操作系统的不同(Linux 操作系统和 Windows 操作系统),它的平台是不一样的。

又比如 CPU 架构的不同, X86 CPU 架构和 AIM CPU 架构也可以认为平台不同。

还可以执行各种层次的优化,这种各种层次的优化究竟是什么呢?一会儿也会详细揭晓。

HotSpot 的即时编译器

那么就目前来说,我们平时比较熟悉的 HotSpot 虚拟机,它内置了两个即时编译器,分别是 C1 编译器(Client Compiler)和 C2 编译器( Server Compiler)。Client Compiler 和 Server Compiler,它们的作用也不同。Client Compiler 注重启动速度和局部的优化,Server Compiler 则更加

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值