Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 7转义分析不起作用_Java_Java 7_Escape Analysis - Fatal编程技术网

Java 7转义分析不起作用

Java 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) {

对于下面给出的代码,我看到了很多GC活动。据我所知,这是一个适合EA的场景。为什么EA是无效的。DummyObject内部没有分配任何内容。使用的JVM选项:-服务器,-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());
        }
    }

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