java JIT优化

JIT优化

1.公告子表达式消除

如果一个表达式的出现多次,并且每次的参数值没有改变,那只需要计算一次,接下来的碰到这个表达式,都会直接取上一次计算的结果

如:int x = a*b+c+d*(a*b);   // a*b是一个公共子表达式,计算了一遍以后,第二次的时候,这个子表达式的参数值都没有变化,所以直接使用上一次这个子表达式的结果

 

2.方法内联

很多时候,为了代码简洁易读等等原因,我们一段逻辑抽成了一个方法,如果运行过程中,这段代码频繁被调用,JVM会把方法替换成方法的内容,就能减少方法调用的压栈操作,节约时间和栈空间,尤其是循环和递归的时候

 

3.逃逸分析之对象的栈上内存分配

如果要创建的对象只会在方法内部使用,不会被外部引用,那么就有可能直接在栈上分配内存来创建这个对象,栈内存是线程私有的,不会涉及到垃圾回收(非常耗费性能),而且栈上的对象只包含实例数据(堆上分配要对象头+实例数据+对齐填充),空间也占得少

 

4.逃逸分析之标量替换

标量:已经是最小单位的数据,比如int,char,long等等

如果一个对象确定不会逃逸,即只会在方法内部使用,不会被别的地方引用,则这个对象会被拆成他的成员变量(标量), 猜测:对象都不存在,标量存在于栈上

 

5.逃逸分析之同步锁消除

synchornized锁住的对象是一个线程私有的,不会被其他线程访问到,那这个锁其实是多余的,JVM会自动帮你去掉锁,加锁和释放锁是耗性能和资源的。

 

逃逸分析有多种,

  • 全局变量赋值逃逸
  • 方法返回值逃逸
  • 实例引用发生逃逸
  • 线程逃逸

 

posted @ 2024-04-16 20:55  坏男银  阅读(31)  评论(0编辑  收藏  举报