HotSpot JIT和逃逸分析

 

JIT

即时编译(Just-in-time Compilation,JIT)是一种经过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术。在HotSpot实现中有多种选择:C一、C2和C1+C2,分别对应client、server和分层编译。
一、C1编译速度快,优化方式比较保守;
二、C2编译速度慢,优化方式比较激进;
三、C1+C2在开始阶段采用C1编译,当代码运行到必定热度以后采用G2从新编译;
在1.8以前,分层编译默认是关闭的,能够添加-server -XX:+TieredCompilation参数进行开启。java

 

逃逸分析

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

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

同步消除

线程同步自己比较耗,若是肯定一个对象不会逃逸出线程,没法被其它线程访问到,那该对象的读写就不会存在竞争,则能够消除对该对象的同步锁,经过-XX:+EliminateLocks能够开启同步消除。线程

标量替换

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

栈上分配

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

原做者:占小狼 连接:https://www.jianshu.com/p/20bd2e9b1f03 來源:简书
相关文章
相关标签/搜索