JVM - 【HotSpot代码优化】标量替换

HotSpot代码优化 - 标量替换

问题:代码中所有new的对象都是分配在Heap上吗? NO!

一:单词汇总

  • scalar n.标量
  • aggregate n.聚合量
  • aggressive adj. 好斗的,侵略性的
  • escape vt.逃避、逃逸
  • analysis n.分析
  • allocation n.分配
  • eliminate vt.消除、排除、淘汰

二:优化参数

  • -XX:+DoEscapeAnalysis (逃逸分析)
    • JDK1.7之后默认开启逃逸分析
  • -XX:+EliminateAllocations (消除分配/标量替换)
    • JDK1.7之后默认开启

三:概念解释

  • 逃逸分析
    判断一个成员变量是否仅仅在当前方法内被调用,即为“逃逸分析”;
  • 标量替换(运行优化策略
    变量如果不可继续分为更小的类型即称为“标量(scalar)”,否则被称为“聚合量(aggregate)”
    如果一个聚合量通过逃逸分析,则会在程序运行时被分解为“标量(scalar)”,存储于VMS栈帧的本地变量表中。

四:测试

package xyz.xx.chapter9;

/**
 * 逃逸分析测试
 *      -XX:+DoEscapeAnalysis
 *          JDK1.7之后默认开启
 *          -XX:+EliminateAllocations (消除分配/标量替换)
 *              JDK1.7之后默认开启
 *      JDK1.7开启逃逸分析后,一些基于逃逸分析的优化技术出现,可以通过虚拟机参数进行配置
 *
 *      逃逸分析需要JVM运行在Server模式下
 *          -server
 */
public class EscapeAnalysisTest1 {
     
    public static void main(String[] args) {
     
        allo();
        try {
     
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
     
            e.printStackTrace();
        }
    }

    // -XX:-EliminateAllocations  ->  61ms
    // -XX:+EliminateAllocations  ->  5ms
    // 标量替换将通过逃逸分析的局部变量(聚合量:aggregate)拆分为标量(scalar),存入VMS栈帧中的本地变量表
    // 是一种运行时优化技术
    static void allo(){
     
        long startTime = System.currentTimeMillis();
        for(int i=0;i<10000000;i++){
     
            User u = new User();
        }
        long endTime = System.currentTimeMillis();
        System.out.println(endTime-startTime+"ms");
    }
}

class User{
     
    String name;
    int age;
    boolean sex;
}

你可能感兴趣的:(JVM,java,jvm,逃逸分析)