JVM逃逸分析

最近学习JVM时,开启逃逸分析栈上分配对象优化,在实践中发现并没有任何效果!!

开启逃逸分析,JVM参数:

-server -verbose:gc -XX:+DoEscapeAnalysis  

不开启就是去掉后面的-XX:+DoEscapeAnalysis参数

主要代码

package com.cjt;

public class Test {

  private static class Foo {
    private int x;
    private static int counter;

    public Foo() {
      x = (++counter);
    }
  }

  public static void main(String[] args) {
    long start = System.nanoTime();
    for (int i = 0; i < 1000 * 1000 * 10; ++i) {
      Foo foo = new Foo();
    }
    long end = System.nanoTime();
    System.out.println("Time cost is " + (end - start));
  }

}

最终结果是,无论上述JVM参数如何设置,JVM gc不变,没有出现网上那种“栈上分配对象,堆上gc不会发生”现象。gc日志如下:

[GC 30464K->616K(116800K), 0.0014522 secs]
[GC 31080K->568K(116800K), 0.0010129 secs]
[GC 31032K->600K(116800K), 0.0008023 secs]
[GC 31064K->552K(147264K), 0.0014494 secs]
Time cost is 57097349

不知是哪里出现问题,我也设置过-Xmx调整堆大小,没有作用。不太清楚网络上的文章都经过实践没有!

望知情大佬解决,感谢!

阅读 3.1k
2 个回答

已经解决,是由于开发工具的debug模式有影响。

1:逃逸分析JDK1.6及以后版本默认开启;

2:可以自定义一个循环创建对象的方法,不设置任何参数run启动是debug启动循环方法耗时的10倍左右

我也不太清楚为什么会出现这种情况,猜测java逃逸分析在debug模式是禁用的,有知情人可以讲解下,谢谢。

说明你分配的对象还未达到重新分配的要求,你可以将 最Xms设置小点

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题