zoukankan      html  css  js  c++  java
  • HotSpot JIT和逃逸分析

    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参数进行开启。

    逃逸分析

    逃逸分析并不是直接的优化手段,而是一个代码分析,通过动态分析对象的作用域,为其它优化手段如栈上分配、标量替换和同步消除等提供依据,发生逃逸行为的情况有两种:方法逃逸和线程逃逸。
    1、方法逃逸:当一个对象在方法中定义之后,作为参数传递到其它方法中;
    2、线程逃逸:如类变量或实例变量,可能被其它线程访问到;

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

    同步消除

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

    标量替换

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

    栈上分配

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


    原作者:占小狼
    链接:https://www.jianshu.com/p/20bd2e9b1f03
    來源:简书
  • 相关阅读:
    IDEA常用快捷键
    mybatis动态sql总结
    端口被占用的问题解决 Web server failed to start. Port ×× was already in use
    java常见的面试题(二)
    java常见的面试题(一)
    Zookeeper学习总结
    Oracle 创建表空间及用户授权、dmp数据导入、表空间、用户删除
    Navicat远程连接服务器mysql
    HashMap的实现原理?如何保证HashMap线程安全?
    ArrayList和LinkedList内部是怎么实现的?他们之间的区别和优缺点?
  • 原文地址:https://www.cnblogs.com/sstone/p/8522847.html
Copyright © 2011-2022 走看看