2012-06-28 56 views
1

对于下面给出的代码,我看到很多GC活动。根据我的理解,这是EA的一个合适的场景。为什么EA没有效果? DummyObject没有内部分配。使用的JVM选项:-server,-verbosegc。Java 7逃逸分析不起作用

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()); 
     } 
    } 

} 
+0

这不是代码运行速度有多快。为什么GC应该频繁地运行以收集内存,这很明显,用flag -verbosegc – Shilu

回答

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选项使用 -server -verbosegc -XX:CompileThreshold = 1

Test1的叫了许多的时代。同样的老故事。 Java在堆中分配内存,GC到来并使一切变得缓慢。对这个功能太过兴奋了。

1

见相关Q &一个here这表明,你可以下载一个调试JDK和使用命令行选项: -XX:+ UnlockDiagnosticVMOptions -XX:+ PrintEscapeAnalysis -XX:+ PrintEliminateAllocations

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

0

的Java API说:

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

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

逃逸分析可能不错,但目前还没有支持水晶球。 ;-) 尝试用自己的方法覆盖它,返回12345.

+0

这个答案是不正确的。文档清楚地表明hashCode应尽可能不同,但根本不需要这样做。例如,即使'return 0;'也是合法的'hashCode()'实现。因此,“不可预测的hashCodes”不是阻止存储器分配优化的原因。 – Nayuki

+0

@NayukiMinase java.lang.Object的hashCode-Method是一个本地方法,所以它在JVM之外运行,不能被JVM优化。我所说的是,覆盖hashCode方法并返回自己的值,以便获得可优化的hashCode-Method。 – Hardcoded