素材牛VIP会员
JVM逃逸分析
 问***m  分类:Java代码  人气:834  回帖:2  发布于6年前 收藏

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

望知情大佬解决,感谢!

 标签:jvmjava

讨论这个帖子(2)垃圾回帖将一律封号处理……

Lv2 入门
麦***气 JAVA开发工程师 6年前#1

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

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

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

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

Lv4 码徒
54***66 学生 6年前#2

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取