• JIT即时编译器指定使用C1和C2


    参数设置

    hotspot jvm 内置了两个jit编译器,分别是client compiler(C1编译器)和server compiler(C2编译器),可通过下列指令显式指定使用哪种即时编译器

     -client 指定java虚拟机运行在client模式下,并使用C1编译器;

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

    -server 指定java虚拟机运行在server模式下,并使用C2编译器。

      特点:C2进行较长时间的优化,以及激进优化。但优化的代码执行效率更高。

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

      C1主要有方法内联,去虚拟化冗余消除

        方法内联:将引用函数代码编译到引用点处,这样可以减少栈帧的生成,减少参数传递以及跳转过程

        去虚拟化:对唯一的实现类进行内联

        冗余消除:在运行期间,把一些不会运行的代码折叠掉

      C2的优化主要是在全局层面,逃逸分析是优化的基础,基于逃逸分析在C2上有如下几种优化

        标量替换:用标量值替换聚合对象的属性值

        栈上分配:对于未逃逸的对象分配对象在栈而不是堆

        同步消除:清除同步操作,通常指synchronized

      分层编译策略:

        程序解释执行(不开启性能监控)可以触发C1编译,将字节码编译成机器码,可以进行简单优化,也可以加上性能监控,C2编译会根据性能监控信息进行激进优化。

        当显式指定了-server   时,默认开启分层编译策略,由C1编译器和C2编译器相互协作共同来执行编译任务。

    此外:

      在JDK10 之后Hotspot又加入了一个全新即时编译器:Graal编译器,目前处于实践状态

        可以通过-XX:+UnlockExperimentalVMOptions   -XX:+UseJVMCICompiler 去激活,才可以使用

      JDK9版本引入了AOT编译器(Ahead of time compiler 静态提前编译器)

        AOT编译工具jaotc,它借助Graal编译器,将所输入的java类文件转换成机器码,并存放至生成动态共享库之中

        所谓的AOT编译,是与即时编译相对立的一个概念,即时编译指的是在程序的运行过程中,将字节码转换为可在硬件上直接运行的机器码,并部署至托管环境中的过程,而AOT编译指的是,在程序运行前,,便将字节码转换为机器码的过程;

        好处:

          java虚拟机加载已经与编译成二进制库,可以直接运行。不必等即时编译器的预热,减少java应用第一次运行慢的体验

        缺点:

          破坏了java“一次编译到处运行”,必须为每个不同硬件,os编译对应的发行包

          降低了java链接过程的动态性,加载的代码在编译器就全部已知;

          还需要继续优化中,最初只支持Linux X64 java base

  • 相关阅读:
    localStorage和sessionStorage区别(包括同源的定义)
    跨域问题实践总结! 上(JSONP/document.domain/window.name)
    7月11日计划
    图形验证码知识点整理 Object.prototype.toString.call()等
    学习日报 7-10(验证码)
    Mysql安装与主从配置
    windows service编程
    Entity Framework——常见报错总结
    Entity Framework——读写分离
    Entity Framework——执行sql语句
  • 原文地址:https://www.cnblogs.com/zyf-yxm/p/13661980.html
Copyright © 2020-2023  润新知