对于下面的给定代码,我看到了很多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());
}
}
}发布于 2013-01-15 00:01:13
请参阅相关的Q&A here,其中建议您可以下载调试JDK并使用命令行选项:-XX:+UnlockDiagnosticVMOptions -XX:+PrintEscapeAnalysis -XX:+PrintEliminateAllocations
在事件发生时打印出逃逸分析事件。
发布于 2012-06-29 14:29:01
一些观察
看起来obj.hashCode()是一个本机调用,对象可能会转义。将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;
}-server -verbosegc -XX:CompileThreshold=1使用的JVM选项
Test1被多次调用。还是老样子。Java在堆中分配内存,GC的出现使一切变慢。对这个功能太兴奋了。
发布于 2013-01-15 00:23:02
Java API说:
类Object定义的hashCode方法确实为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的,但JavaTM编程语言不需要这种实现技术。)
因此,您正在生成对象,为每个对象生成不可预测的hashCodes,并将它们与某个值进行比较。另外,它是一个本机方法,所以JIT不知道里面发生了什么。
逃逸分析可能不错,但目前还没有对水晶球的支持。;-)尝试使用您自己的方法覆盖它,返回12345。
https://stackoverflow.com/questions/11239028
复制相似问题