晚期(运行期)优化

  1.为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time,JIT编译器)。

  2.Hotspot虚拟机内的即时编译器

   (1)解释器与编译器

    主流的商用虚拟机,如Hotspot,J9等,都同时包含解释器和编译器。

    解释器与编译器两者各有优势:当程序需要快速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。在程序运行后,随着时间得推移,编译器组件发挥作用,把越来越多的代码编译成本地代码,可以获取更高的执行效率。

    Hotspot虚拟机中内置了两个编译器,分别称为Client Compiler和Server Compiler,简称C1编译器和C2编译器,也叫Opto编译器。

    目前主流的Hotspot虚拟机中,默认采用解释器与其中一个编译器直接配合的方式工作。用户可以只用“-client”或“-server”参数去强制指定虚拟机运行在Client模式或Server模式。

    可以使用参数“-Xint”强制虚拟机运行于“解释模式”。

    可以使用参数“-Xcomp”强制虚拟机运行于“编译模式”。

    分层编译:

    a) 第0层:程序解释执行,解释器不启动性能监控功能,可以触发第1层 编译

    b) 第1层:也称为C1编译,将字节码编译为本地代码,进行简单,可靠的优化,如有必要将加入性能监控的逻辑

    c) 第2层(或2层以上):也称为C2编译,也是将字节码编译成本地代码,但是会启用一些编译耗时较低的优化,甚至会根据性能监控信息进行一些不可靠的激进优化

    (2)编译对象与触发条件

      热点探测判定方式:基于采样的热点探测和计数的热点探测。

      Hotspot虚拟机采用基于计数器的热点探测方法,它为每个方法准备了两类计数器:方法调用计数器和回收计数器。

        

             

    (3)编译过程

      Client Compiler是一个简单快速地三段编译器,主要的关注点在于局部性的优化,而放弃了许多耗时较长的局部优化手段。

      第一阶段,一个平台独立的前端将字节构造成一种高级中间代码表示(HIR)

      第二阶段,一个平台相关的后端从HIR中产生低级中间代码表示(LIR)

      最后阶段,在平台相关的后端使用线性扫描算法在LIR上分配寄存器,并在LIR上做窥孔优化,然后产生机器代码

      Server Compiler是专门面向服务端的典型用用并为服务端的性能配置特别调整过的编译器,也是一个充分优化过的高级编译器,它会执行所有经典的优化动作。

编译优化技术

  1.优化技术

  • 编译器策略:延迟编译,分层编译,栈上替换,延迟优化,程序依赖图表示,静态单赋值表示。
  • 基于性能监控的优化技术:乐观空值断言,乐观类型断言,乐观类型增强,乐观数组增强,裁剪未被选择的分支,乐观的多态内联。分支频率预测,调用频率预测
  • 基于证据的优化技术:精确性推断,内存值推断,内存值跟踪,常量折叠,重组,操作符退化,空值检查消除。类型检测退化,类型检测消除,代数化简,公共子表达式消除
  • 数据流敏感重写:条件常量传播,基于六承载的类型缩减转换,无用代码消除
  • 语言相关的优化技术:类型继承关系分析,去虚拟机化,符号常量传播,自动装箱,消除逃逸分析,锁消除,锁膨胀,消除反射
  • 内存及代码位置交换:表达式提升,表达式下沉,冗余存储消除,相邻存储合并,交汇点分离
  • 循环变换:循环展开,循环剥离,安全点消除,迭代分离,范围检查消除
  • 局部代码调整:内联,全局代码提升,基于热度的代码分离,Switch调整
  • 控制流图变换:本地代码编排,本独代码封包,延迟槽填充,着色图寄存器分配,线性扫描寄存器分配,复写聚合,常量分裂,复写移除,地址模式匹配。指令窥孔优化,基于确定有限状态机的代码生成

  2.公共子表达式

  优化仅限于程序的基本快内,便称为内部公共子表达式消除。

  如果优化的范围涵盖了多个基本块,就称为全局公共子表达式消除。

  

JVM-程序编译与代码晚期(运行期)优化的更多相关文章

  1. 【深入理解JAVA虚拟机】第4部分.程序编译与代码优化.2.运行期优化。这章提到的具体的优化技术,应该对以后做性能工作会有帮助。

    1.概述 Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code). 为了提高 ...

  2. JVM原理:4 运行期优化

    JVM运行期优化 Java程序在运行的期间,可能会有某个方法或者代码块的运行特别频繁时,就会把这些代码认定为“热点代码”.为了提高热点代码的执行效率,在运行时JVM会将这些代码编译成与本地平台相关的机 ...

  3. jvm虚拟机笔记<六> 运行期优化

    这节我们总结一下JVM运行期的优化问题. https://www.cnblogs.com/zhouyuqin/p/5224573.html JVM运行期优化 即时编译器(JIT) 编译对象与触发条件 ...

  4. 深入了解JVM虚拟机8:Java的编译期优化与运行期优化

    java编译期优化 java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程:1.前端编译:把.java文件转变为.class文件2.后端编译:把字节码转变为机器码3.静态提前编译: ...

  5. C++编译期多态与运行期多态

    前言 今日的C++不再是个单纯的"带类的C"语言,它已经发展成为一个多种次语言所组成的语言集合,其中泛型编程与基于它的STL是C++发展中最为出彩的那部分.在面向对象C++编程中, ...

  6. JIT晚期(运行期)

    在部分的商用虚拟机(Sun HotSpot.IBM J9)中,Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为& ...

  7. Java基础知识强化之IO流笔记05:try...catch...finally包含的代码是运行期的

    1. 代码示例: 上面看到的第13行:  Date  d = null;(这里必须初始化) 第14~20行使用try...catch...finally包含代码,这里的代码已经变成运行期代码.此时我们 ...

  8. Java虚拟机11:运行期优化

    前言 http://www.cnblogs.com/xrq730/p/4839245.html,HotSpot采用的是解释器+编译器并存的架构,之前的这篇文章里面已经讲过了,本文只是把即时编译器这块再 ...

  9. Java虚拟机15:运行期优化

    前言 HotSpot采用的是解释器+编译器并存的架构,之前的这篇文章里面已经讲过了,本文只是把即时编译器这块再讲得具体一点而已.当然,其实本文的内容也没多大意义,90%都是概念上的东西,对于实际开发. ...

随机推荐

  1. python脚本利用windows计划定时执行

  2. UBUNTU下Y86模拟器的安装和使用

    UBUNTU下Y86模拟器的安装和使用 由于上周在虚拟机中安装Y86模拟器中出现了一些问题并且没得到解决,所以上周实验是在实验楼上做的,这几天练习了UBUNTU下Y86模拟器的安装和使用. 参考博客: ...

  3. 使用Lombok简化你的代码

    一.安装 eclipse 下载:https://projectlombok.org/       双击安装即可. 重启eclipse/myeclipse         如果有报错,clean一下项目 ...

  4. [转]Win7 64位搭建本地SVN服务器 Apache+Subversion

    转载地址:http://blog.sina.com.cn/s/blog_4f072a7001015j5z.html 一.工具下载 01.SVN 服务器Subversion:Setup-Subversi ...

  5. 【转】Struts1.x系列教程(2):简单的数据验证

    转载地址:http://www.blogjava.net/nokiaguy/archive/2009/01/archive/2009/01/13/251197.html 简单验证从本质上说就是在服务端 ...

  6. IOS new Date() 时间转换失败问题以及其他问题

    一: ios下必须标准格式用'/'分割格式 转换没问题:  new Date('2016/5/30 12:15:20') 二:ie9兼容模式以及以下ie版本 console用前需判断 if(windo ...

  7. java list倒序输出及复制list集合

    如原来有一个集合list,list里面是有数据的,现在如果把list中的集合倒序过来,加这代码 Collections.reverse(list);此代码中传入原来的list数据 有这代码后list在 ...

  8. EF获取一个或者多个字段

    有时候直接查询出一个实体,比较浪费性能,对于字段比较少的表来说差异不大,但是如果一个表有几十个字段,你只要取出一个字段或者几个字段,而取出整个实体,性能就会有差异了. /// <summary& ...

  9. python之rabbitMQ篇

    一.RabbitMQ安装 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统,它遵循Mozilla Pulic License开源协议. MQ全称为Message Queue,消息队列 ...

  10. html5 svg动画

    http://www.zhangxinxu.com/sp/svg/ 以上是svg的一个线上编辑器,也可以adobe Illustrator制作生成. 我们通过以上编辑器可以获得以下代码. 例: < ...