美文网首页术业专攻
即时编译和逃逸分析

即时编译和逃逸分析

作者: 烟雨乱平生 | 来源:发表于2019-10-17 21:12 被阅读0次

JIT

即时编译(Just-in-time Compilation,JIT)是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术。在HotSpot实现中有多种选择:C1、C2和C1+C2,分别对应client、server和分层编译。

  1. C1编译速度快,优化方式比较保守;
  2. C2编译速度慢,优化方式比较激进;
  3. C1+C2在开始阶段采用C1编译,当代码运行到一定热度之后采用G2重新编译;

在1.8之前,分层编译默认是关闭的,可以添加-server -XX:+TieredCompilation参数进行开启。

逃逸分析

逃逸分析并不是直接的优化手段,而是一个代码分析,通过动态分析对象的作用域,为其它优化手段如栈上分配、标量替换和同步消除等提供依据,发生逃逸行为的情况有两种:方法逃逸和线程逃逸。

  • 方法逃逸:当一个对象在方法中定义之后,作为参数传递到其它方法中;
  • 线程逃逸:如类变量或实例变量,可能被其它线程访问到;

如果不存在逃逸行为,则可以对该对象进行如下优化:同步消除、标量替换和栈上分配。

同步消除

线程同步本身比较耗,如果确定一个对象不会逃逸出线程,无法被其它线程访问到,那该对象的读写就不会存在竞争,则可以消除对该对象的同步锁,通过-XX:+EliminateLocks可以开启同步消除。

标量替换

  1. 标量是指不可分割的量,如java中基本数据类型和reference类型,相对的一个数据可以继续分解,称为聚合量;
  2. 如果把一个对象拆散,将其成员变量恢复到基本类型来访问就叫做标量替换;
  3. 如果逃逸分析发现一个对象不会被外部访问,并且该对象可以被拆散,那么经过优化之后,并不直接生成该对象,而是在栈上创建若干个成员变量;

通过-XX:+EliminateAllocations可以开启标量替换, -XX:+PrintEliminateAllocations查看标量替换情况。

栈上分配

就是在栈上分配对象,其实目前Hotspot并没有实现真正意义上的栈上分配,实际上是标量替换。


相关文章

  • 即时编译和逃逸分析

    JIT 即时编译(Just-in-time Compilation,JIT)是一种通过在运行时将字节码翻译为机器码...

  • 聊一聊go的内存逃逸分析

    什么是内存逃逸分析 内存逃逸分析是go的编译器在编译期间,根据变量的类型和作用域,确定变量是堆上还是栈上 简单说就...

  • Go 语言逃逸分析(版本1.18.2)

    什么是逃逸分析? 逃逸分析(escape analysis)就是在程序编译阶段根据程序代码中的数据流,对代码中哪些...

  • GO内存逃逸是什么

    一、我们说内存逃逸时在说什么 问,内存逃逸是干什么的答,内存逃逸分析是编译器在编译优化时,用来决定变量应该分配在堆...

  • 逃逸分析

    逃逸分析 在编程语言的编译优化原理中,分析指针动态范围的方法称之为逃逸分析。通俗来讲,当一个对象的指针被多个方法或...

  • JAVA逃逸分析、栈上分配、标量替换、同步消除

    一、逃逸分析 逃逸分析是编译语言中的一种优化分析,而不是一种优化的手段。通过对象的作用范围的分析,为其他优化手段提...

  • golang 逃逸分析_v1.0.0

    逃逸分析是golang编译器分析一个对象到底应该放到堆内存上,还是栈内存上逃逸是指在某个方法之内创建的对象,除了在...

  • 逃逸分析

    From - 自由编程 所谓逃逸分析(Escape analysis),是指由编译器进行内存分配策略分析, 通过编...

  • Java 逃逸分析

    > 什么是逃逸分析? - 关于 Java 逃逸分析的定义: - 逃逸分析(Escape Analysis)简单...

  • java对象分配过程

    1.编译器通过逃逸分析判断对象是在栈上分配还是堆上分配,如果是堆上分配则进入下一步。(开启逃逸分析需要设置jvm参...

网友评论

    本文标题:即时编译和逃逸分析

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