2

对于下面给出的代码,我看到了很多 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());
        }
    }

}
4

3 回答 3

1

请参阅此处的相关问答,这表明您可以下载调试 JDK 并使用命令行选项:-XX:+UnlockDiagnosticVMOptions -XX:+PrintEscapeAnalysis -XX:+PrintEliminateAllocations

在逃逸分析事件发生时打印出来。

于 2013-01-14T16:01:12.680 回答
0

一些观察

似乎 obj.hashCode() 是本机调用,并且对象可能会 escape 。将 obj.hashCode() 更改为 obj.getMyCode() (一种返回 System.currentTimeMillis()% staticObjCount 的方法)使其工作。没有观察到 GC 活性。然而,以下方法从未得到有效的逃逸分析,这里提到的所有建议

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

使用的 JVM 选项 -server -verbosegc -XX:CompileThreshold=1

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

于 2012-06-29T06:29:01.317 回答
0

Java API 说:

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

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

Escape Analysis 可能不错,但目前不支持水晶球。;-) 尝试用您自己的方法覆盖它,返回 12345。

于 2013-01-14T16:23:02.070 回答