JVM中编译器

前端编译器:

概念:

  • 把.java文件转变成.class文件。

举例:

  • javac、各种IDE中的编译器。

即时编译器(JIT编译器: Just In Time Compiler):

概念:

  • JIT编译器在运行时会针对那些频繁被调用的“热点代码”做出深度优化,并将其直接编译为对应平台的本地机器指令,以此提升Java程序的执行性能。由于这种编译方式发生在方法的执行过程中,因此也被称之为栈上替换,或简称为OSR (On StackReplacement)编译。

HotSpot VM 中的JIT编译器:

C1编译器(Client Compiler)

  • C1编译器会对字节码进行简单和可靠的优化,耗时短。以达到更快的编译速度。

C2编译器(Server Compiler)

  • C2进行耗时较长的优化,以及激进优化。但优化的代码执行效率更高。

参数:

  • -client: 指定Java虚拟机运行在Client模式下,并使用C1编译器;
  • -server: 指定Java虚拟机运行在Server模式下,并使用C2编译器。
  • 说明:64位操作系统默认使用-server服务器模式,即C2编译器。

C1和C2编译器不同的优化策略

  • 在不同的编译器上有不同的优化策略,C1编译器上主要有方法内联,去虚拟化、冗余消除。
    • 方法内联:将引用的函数代码编译到引用点处,这样可以减少栈帧的生成,减少参数传递以及跳转过程
    • 去虚拟化:对唯一的实现类进行内联
    • 冗余消除:在运行期间把一些不会执行的代码折叠掉
  • C2的优化主要是在全局层面,逃逸分析是优化的基础。基于逃逸分析在C2.上有如下几种优化:(server模式下才会有这些优化,64位系统默认就是server模式)
    • 标量替换:用标量值代替聚合对象的属性值
    • 栈上分配:对于未逃逸的对象分配对象在栈而不是堆
    • 同步消除:清除同步操作,通常指synchronized
  • C2编译器启动时长比C1编译器慢,系统稳定执行以后,C2编译器执行速度远远快于C1编译器。
  • 程序解释执行(不开启性能监控)可以触发C1编译,将字节码编译成机器码,可以进行简单优化,也可以加上性能监控,C2编译会根据性能监控信息进行激进优化。
  • 不过在Java7版本之后,一旦开发人员在程序中显式指定命令“-server"时,默认将会开启分层编译策略,由C1编译器和C2编译器相互协作共同来执行编译任务。

原理:

Java即时编译器原理解析及实践 - 美团技术团队

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值