美文网首页
编译期的优化和运行期的优化

编译期的优化和运行期的优化

作者: 简书徐小耳 | 来源:发表于2018-11-25 16:10 被阅读1次
编译期存在以下情况:
    1. 编译器(idea)把java文件编译称为class文件
  • 2.JIT编译器(hotspot的 c1 c2)把字节码转化成机器码
  • 3.静态提前编译器(GCJ)直接把java文件编译成机器码

我们目前提到的编译期都说的是第一种

运行期的优化(以hotspot为例子)
  • 程序启动的时候依靠解释器进行解释执行的
  • 当某段方法或代码块运行的特别频繁就会把其认定为热点代码,jvm则会把这些代码编译成与本地平台相关的机器码,并进行各种优化,这就是JIT编译器
为何hotspot需要解释器和编译器并存的架构
  • 当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间。
  • 当程序运行之后,随着事件的推移,编译器把越来越多的代码编译成本地代码之后,获取跟高的执行效率。
  • 解释器可以快起启动节省内存,提供逃生门。当编译器进行激进优化的假设不成立(比如类重新加载了),可以让代码变为解释执行。
  • 编译器可以获高的执行效率
为何hotspot要实现两个不同的即时编译器
  • 两个JIT分别client compiler(c1) 和server compiler (c2)
  • 默认是采用解释器和c1或c2配合 具体的 我们通过参数 -client 或-server指定
何时使用解释器执行何时使用编译器执行
  • 为了在程序启动相应速度和运行效率之间达到平和,hotspot 采用分层编译
  • 0层 程序解释执行,不开启性能监控,可以触发第一层编译
  • 1层也成为c1编译器,将字节码编译称为本地代码,进行简单可靠的优化,如有必要将加入性能监控的逻辑
  • 2层c2编译,也是讲代码编译为本地代码,但是会启用一些编译耗时较长的优化。
  • 实施分层编译后 client和servercompiler 都会同时工作,用client获取更快的编译的速度,用server获取更好的编译质量,在解释执行的时候也无需在承担收集性能监控信息的任务
哪些程序代码会被编译为本地代码?如何编译

热点代码会被编译本地代码,下面2中情况就是热点代码

  • 被多次调用的方法

  • 被多次执行的循环体

  • 上述两者都会被以方法为整个编译对象进行编译

  • 因为方法在执行过程总所以我们称之为栈上替换

  • 判断热点的方法分为抽样计次和计数器计次,前者简单高效但是不严谨,后者严谨但是比较麻烦(默认是后者)

  • hotspot准备了两个计数器:方法调用计数器和回边计数器,前者用来解决热点判断1,后者用来解决循环体。根据两个计数器之后判断是否需要编译


    image.png
    image.png
  • 编译是在后台线程值的

  • 后台编译的时候对于C1如下:


    image.png
  • 后台编译时候对于C2如下:

优化手段

  • 方法内联(将方法合并):去除方法调用成本,为其他优化建立基础。因为方法内联需要确定调用方法的版本,对于虚方法则会存在问题,因为其每一次调用的版本都不一定是同一个版本。hotspot采用CHA进行判断某个接口是否有多于一种的实现,某个类是否存在子类且子类是否为抽象类等信息。
    编译器对于非虚方法可以直接进行内联,对于虚方法,则会向CHA查询次方在当前程序下释放有多个目标可供选择,如果查询只有一个版本,那也可以进行内联,其属于激进优化需要留下逃生门,我们称之为守护内联,如果在程序执行的过程中虚拟机一直没有加载到会令这个方法的接收者的继承关系发生变化的类,内联优化可以使用。否则则退回到解释执行。
    如果查询到有多个版本的目标方法可以选择,则编译器还会使用内联缓存来完成方法内联,其建立在目标方法正常入口之前的缓存。
  • 公共子表达式去除:比如int a=(cb)12+(cb),可以直接将其变为int a=(E)12+(E)甚至变为int a=(E)*13
  • 数组边界检测消除:对于虚拟机的执行子系统来说,每次数组元素的读写带有一次隐含的条件判断,但是优化后对于常量则可以不用去做 ,只要在已知数组的长度
  • 逃逸分析:当一个对象在方法里面被定义后,它有可能被外部方法所引用,比如赋值给类变量或者其他线程能访问到的实例变量。如果一个对象不会逃逸到方法和或者线程之外,则可以采用栈上分配,同步消除(消除锁),标量替换(标量是指jvm中的原始类型,不能再进一步分解。反之称为聚合量。如果对象没有逃逸,那么jvm可能不会创建这个对象,而是直接创建这个对象中被使用到的标量)

相关文章

网友评论

      本文标题:编译期的优化和运行期的优化

      本文链接:https://www.haomeiwen.com/subject/eedpqqtx.html