zoukankan      html  css  js  c++  java
  • HotSpot VM 中的JIT分类

      在HotSpot VM中内嵌有两个JIT编译器,分别为Client Compiler和Server Compiler,但大多数情况下我们简称为C1编译器和C2编译器。开发人员可以通过如下命令显式指定Java虚拟机在运行时到底使用哪一种即时编译器,如下所示:

    • -client: 指定Java虚拟机运行在Client模式下,并使用C1编译器;
      • C1编译器会对字节码进行简单和可靠的优化,耗时短。以达到更快的编译速度。
    • -server: 指定Java虚拟机运行在Server模式下,并使用C2编译器。
      • C2进行耗时较长的优化,以及激进优化。但优化的代码执行效率更高

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

    • 在不同的编译器上有不同的优化策略,C1编译器上主要有方法内联,去虚拟化、冗余消除
      • 方法内联:将引用的函数代码编译到引用点处,这样可以减少栈帧的生成,减少参数传递以及跳转过程
      • 去虚拟化:对唯一的实现类进行内联
      • 冗余消除:在运行期间把一些不会执行的代码折叠掉
    • C2的优化主要是在全局层面,逃逸分析是优化的基础。基于逃逸分析在C2.上有如下几种优化:(server模式下才会有这些优化,64位系统默认就是server模式)
      • 标量替换:用标量值代替聚合对象的属性值
      • 栈上分配:对于未逃逸的对象分配对象在栈而不是堆
      • 同步消除:清除同步操作,通常指synchronized

      分层编译(Tiered Compilation)策略:程序解释执行(不开启性能监控)可以触发C1编译,将字节码编译成机器码,可以进行简单优化,也可以加上性能监控,C2编译会根据性能监控信息进行激进优化,不过在Java7版本之后,一旦开发人员在程序中显式指定命令“-server"时,默认将会开启分层编译策略,由C1编译器和C2编译器相互协作共同来执行编译任务

    总结

    • 一般来讲,JIT编译出来的机器码性能比解释器高
    • C2编译器启动时长比C1编译器慢,系统稳定执行以后,C2编译器执行速度远远快于C1编译器

    附:JVM学习目录

  • 相关阅读:
    C++ 用libcurl库进行http通讯网络编程(转)
    树莓派声音设置
    在Linux终端命令行下播放音乐的命令(Ubuntu)
    2.1 LibCurl编程流程(转)
    linux编译curl库的动态库so(转)
    单片机中断的IE和IP寄存器(摘抄)
    MCS-51系列特殊功能寄存器(摘抄)
    linux c libcurl的简单使用(转)
    普林斯顿结构 VS 哈佛结构
    树莓派(raspberry pi)学习4: 更改键盘布局(转)
  • 原文地址:https://www.cnblogs.com/ding-dang/p/13086637.html
Copyright © 2011-2022 走看看