Java 7转义分析不起作用
对于下面给出的代码,我看到了很多GC活动。据我所知,这是一个适合EA的场景。为什么EA是无效的。DummyObject内部没有分配任何内容。使用的JVM选项:-服务器,-verbosegcJava 7转义分析不起作用,java,java-7,escape-analysis,Java,Java 7,Escape Analysis,对于下面给出的代码,我看到了很多GC活动。据我所知,这是一个适合EA的场景。为什么EA是无效的。DummyObject内部没有分配任何内容。使用的JVM选项:-服务器,-verbosegc static void anayzeEA() { for(int i = 0 ; i < 100000000; i++) { DummyObject obj = new DummyObject(); if(obj.hashCode() == 97787) {
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());
}
}
}
static void anayzeEA()
{
对于(int i=0;i<100000000;i++){
DummyObject obj=新的DummyObject();
如果(obj.hashCode()==97787){//,则阻止优化obj
System.out.println(obj.hashCode());
}
}
}
一些观察结果
似乎obj.hashCode()是一个本机调用,对象可能会转义。将obj.hashCode()更改为obj.getMyCode()(一种返回System.currentTimeMillis()%staticObjCount的方法)使其工作。未观察到GC活性。然而,以下方法从未对所有提及的建议进行有效的逃逸分析使用的JVM选项 -服务器 -详细GC -XX:CompileThreshold=1 Test1被多次调用。老一套。Java在堆中分配内存,GC的出现使一切变得缓慢。我对这个功能太兴奋了 一些观察结果 似乎obj.hashCode()是一个本机调用,对象可能会转义。将obj.hashCode()更改为obj.getMyCode()(一种返回System.currentTimeMillis()%staticObjCount的方法)使其工作。未观察到GC活性。然而,以下方法从未对所有提及的建议进行有效的逃逸分析
使用的JVM选项 -服务器 -详细GC -XX:CompileThreshold=1 Test1被多次调用。老一套。Java在堆中分配内存,GC的出现使一切变得缓慢。我对这个功能太兴奋了 请参阅相关问答,其中建议您可以下载调试JDK并使用命令行选项: -XX:+UnlockDiagnosticVMOptions-XX:+PrintEscapeAnalysis-XX:+PrintEliminateAllocations 要在转义分析事件发生时打印出来。请参阅相关问答,其中建议您可以下载调试JDK并使用命令行选项: -XX:+UnlockDiagnosticVMOptions-XX:+PrintEscapeAnalysis-XX:+PrintEliminateAllocations 在转义分析事件发生时打印出来。Java API说明: 只要是合理可行的,类对象定义的hashCode方法确实会为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要这种实现技术。) 因此,您正在生成对象,为每个对象生成不可预测的哈希代码,并将它们与某个值进行比较。另外,它是本机方法,因此JIT不知道内部发生了什么 逃逸分析可能不错,但目前还不支持水晶球 尝试用您自己的方法覆盖它,返回12345。Java API说: 只要是合理可行的,类对象定义的hashCode方法确实会为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要这种实现技术。) 因此,您正在生成对象,为每个对象生成不可预测的哈希代码,并将它们与某个值进行比较。另外,它是本机方法,因此JIT不知道内部发生了什么 逃逸分析可能不错,但目前还不支持水晶球
尝试用您自己的方法重写它,返回12345。这与代码的运行速度无关。为什么GC应该频繁运行以收集内存,这一点在标志verbosegc中非常明显,这与代码的运行速度无关。为什么GC应该频繁运行以收集内存,这在-verbosegc标志中非常明显。这个答案是不正确的。文档中明确指出,hashCode应该尽可能地不同,但根本不需要这样做。例如,偶数
返回0
是一种合法的hashCode()
实现。因此,“不可预测的hashCodes”不是阻止内存分配优化的原因。@NayukiMinase java.lang.Object的hashCode方法是本机方法,因此它在JVM之外运行,无法由JVM优化。我所说的是,覆盖hashCode方法并返回您自己的值,以便获得一个可优化的hashCode-method。这个答案是错误的。文档中明确指出,hashCode应该尽可能地不同,但根本不需要这样做。例如,偶数返回0
是一种合法的hashCode()
实现。因此,“不可预测的hashCodes”不是阻止内存分配优化的原因。@NayukiMinase java.lang.Object的hashCode方法是本机方法,因此它在JVM之外运行,无法由JVM优化。我所说的是,覆盖hashCode方法并返回您自己的值,以便获得一个可优化的hashCode方法。
public static long test1()
{
long r = 0;
byte[] arr = new byte[(int)System.currentTimeMillis() % 1024];
if(arr.length == 998 ) {
++r;
}
return r;
}