为了账号安全,请及时绑定邮箱和手机立即绑定

JVM逃逸分析

JVM逃逸分析

杨魅力 2019-02-23 17:44:20
最近学习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调整堆大小,没有作用。不太清楚网络上的文章都经过实践没有! 望知情大佬解决,感谢!
查看完整描述

2 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

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

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

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

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

查看完整回答
反对 回复 2019-03-01
?
MM们

TA贡献1886条经验 获得超2个赞

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

查看完整回答
反对 回复 2019-03-01
  • 2 回答
  • 0 关注
  • 704 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信