Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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 9及更高版本中的Escape分析和堆栈分配优化改进_Java_Jvm_Compiler Optimization_Escape Analysis_Stack Allocation - Fatal编程技术网

JAVA 9及更高版本中的Escape分析和堆栈分配优化改进

JAVA 9及更高版本中的Escape分析和堆栈分配优化改进,java,jvm,compiler-optimization,escape-analysis,stack-allocation,Java,Jvm,Compiler Optimization,Escape Analysis,Stack Allocation,热点Java 9-13的堆栈分配优化规则是否不那么严格? 在Java7和Java8热点中,对象的堆栈分配(由于JVM优化称为标量对象替换)是可能的,但要在线程堆栈上实现无垃圾分配,必须满足一些严格的约束 Java 8(HotSpot,OpenJDK 8)的堆栈分配优化规则总结如下: 至于Java 7,这里: 在这个问题中,我想了解在较新的JDK版本中EA和堆栈分配优化的当前状态是什么?其他Java虚拟机(如OpenJ9)是否有不同的规则?从链接的答案中可以看出:“另一个需要知道的重要问题是,H

热点Java 9-13的堆栈分配优化规则是否不那么严格?

在Java7和Java8热点中,对象的堆栈分配(由于JVM优化称为标量对象替换)是可能的,但要在线程堆栈上实现无垃圾分配,必须满足一些严格的约束

Java 8(HotSpot,OpenJDK 8)的堆栈分配优化规则总结如下: 至于Java 7,这里:


在这个问题中,我想了解在较新的JDK版本中EA和堆栈分配优化的当前状态是什么?其他Java虚拟机(如OpenJ9)是否有不同的规则?

从链接的答案中可以看出:“另一个需要知道的重要问题是,Hotspot实际上并没有实现对象的堆栈分配。相反,它实现了标量替换,…”术语“堆栈分配”对于这种优化的实际目的是有误导性的。因此,在最近的JVM中没有明显的变化,只是因为将对象放在堆栈上从来不是目标。@Holger是的,我知道这是一种JVM优化技术,而不是语言内置功能。也许在Java中引入ValueTypes时,我们可以在堆栈上分配复杂类型。读了你的评论后,我在问题标题中添加了明确的“优化”一词。这不是我的观点。Hotspot执行标量替换,这允许将临时对象的字段视为局部变量,从而实现后续优化,如常量折叠、部分冗余消除、强度降低、死代码消除、寄存器分配等。因此,如果既不消除也不分配给寄存器,字段值可能最终出现在堆栈上,但这不是主要目标。因此,标量替换不适用于更广泛的场景,因为只有那些允许后续代码优化的场景才真正重要。但如果临时对象嵌套了另一个对象(即使它也是临时的),标量替换在HotSpot JVM 8中不起作用。链接问题中的一个限制说明了这一点。@digital_infinity您当然可以尝试在VM上使用一些标志,然后查看输出。但发生这种情况的C2是一个非常“旧”的编译器,我怀疑它已经发生了很大的变化。。。更有趣的部分是尝试对抗格拉尔的C2。