JIT优化
1.公告子表达式消除
如果一个表达式的出现多次,并且每次的参数值没有改变,那只需要计算一次,接下来的碰到这个表达式,都会直接取上一次计算的结果
如:int x = a*b+c+d*(a*b); // a*b是一个公共子表达式,计算了一遍以后,第二次的时候,这个子表达式的参数值都没有变化,所以直接使用上一次这个子表达式的结果
2.方法内联
很多时候,为了代码简洁易读等等原因,我们一段逻辑抽成了一个方法,如果运行过程中,这段代码频繁被调用,JVM会把方法替换成方法的内容,就能减少方法调用的压栈操作,节约时间和栈空间,尤其是循环和递归的时候
3.逃逸分析之对象的栈上内存分配
如果要创建的对象只会在方法内部使用,不会被外部引用,那么就有可能直接在栈上分配内存来创建这个对象,栈内存是线程私有的,不会涉及到垃圾回收(非常耗费性能),而且栈上的对象只包含实例数据(堆上分配要对象头+实例数据+对齐填充),空间也占得少
4.逃逸分析之标量替换
标量:已经是最小单位的数据,比如int,char,long等等
如果一个对象确定不会逃逸,即只会在方法内部使用,不会被别的地方引用,则这个对象会被拆成他的成员变量(标量), 猜测:对象都不存在,标量存在于栈上
5.逃逸分析之同步锁消除
synchornized锁住的对象是一个线程私有的,不会被其他线程访问到,那这个锁其实是多余的,JVM会自动帮你去掉锁,加锁和释放锁是耗性能和资源的。
逃逸分析有多种,
- 全局变量赋值逃逸
- 方法返回值逃逸
- 实例引用发生逃逸
- 线程逃逸
标签:java,对象,方法,JIT,逃逸,线程,标量,优化,表达式 From: https://www.cnblogs.com/huainanyin/p/17152182.html