性能问答>JVM逃逸分析相关疑惑>
1回复
1年前

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调整堆大小,没有作用。不太清楚网络上的文章都经过实践没有!

2585 阅读
请先登录,再评论

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

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

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

1年前