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