Java 7转义分析不起作用

时间:2012-06-28 06:18:53

标签: java java-7 escape-analysis

对于下面给出的代码,我看到很多GC活动。根据我的理解,这是EA的合适场景。为什么EA无效。 DummyObject里面没有任何内容。使用的JVM选项:-server,-verbosegc。

   static void anayzeEA()
{
    for(int i = 0 ; i < 100000000; i++) {
        DummyObject obj = new DummyObject();
        if(obj.hashCode() == 97787) { //to prevent the obj being optimized            
         System.out.println(obj.hashCode());
        }
    }

}

3 个答案:

答案 0 :(得分:1)

请参阅相关的Q&amp; A here,建议您可以下载调试JDK并使用命令行选项: -XX:+ UnlockDiagnosticVMOptions -XX:+ PrintEscapeAnalysis -XX:+ PrintEliminateAllocations

在转发事件发生时打印出来。

答案 1 :(得分:0)

一些观察

似乎obj.hashCode()是本机调用,对象可能会转义。将obj.hashCode()更改为obj.getMyCode()(返回System.currentTimeMillis()%staticObjCount的方法)使其工作。未观察到GC活性。然而,遵循所提出的所有建议,以下方法从未进行有效的逃逸分析 here

 public static long test1() 
{
    long r = 0;
    byte[] arr = new byte[(int)System.currentTimeMillis() % 1024]; 
    if(arr.length == 998 ) {
        ++r;
    }
    return r;
}

使用的JVM选项 -服务器 -verbosegc -XX:CompileThreshold = 1

多次调用Test1。同样的老故事。 Java在堆中分配内存,GC来并使一切变慢。对这个功能太兴奋了。

答案 2 :(得分:0)

Java API说:

  

尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术。)

因此,您正在生成对象,为每个对象生成不可预测的hashCodes,并将它们与某个值进行比较。另外它是一种原生方法,所以JIT不知道里面发生了什么。

逃生分析可能会很好,但目前不支持水晶球。 ;-) 尝试用自己的方法覆盖它,返回12345。