我正在使用Java 7中的转义分析进行一些测试,以便更好地了解哪些对象有资格进行堆栈分配.
这是我编写的用于测试堆栈分配的代码:
import java.util.ArrayList;
import java.util.Iterator;
public class EscapeAnalysis {
private static final long TIME_TO_TEST = 10L * 1000L; // 10s
static class Timestamp {
private long millis;
public Timestamp(long millis) {
this.millis = millis;
}
public long getTime() {
return millis;
}
public void setTime(long time) {
millis = time;
}
}
public static void main(String[] args) {
long r = 0;
System.out.println("test1");
r += test1();
System.out.println("test2");
r += test2();
System.out.println("test3");
r += test3();
System.out.println("test4");
r …Run Code Online (Sandbox Code Playgroud) 每当我在java中发起一个列表时,我都会这样做
List<Integer> list = new LinkedList<>();
Run Code Online (Sandbox Code Playgroud)
我假设这将在堆上分配列表.不知道我是否可以在堆栈上分配列表?
HotSpot Java 9-13 的堆栈分配优化规则是否不太严格?
在 Java 7 和 Java 8 HotSpot 中,对象的堆栈分配(由于称为标量对象替换的 JVM 优化)是可能的,但要在线程堆栈上实现无垃圾分配,必须满足许多严格的约束。
针对 Java 8(HotSpot、OpenJDK 8)启用堆栈分配优化的规则总结在这个问题的精彩回答中: Hotspot 什么时候可以在堆栈上分配对象? 至于 Java 7,这里: Eligibility for escapeanalysis/stack allocate with Java 7
在这个问题中,我想了解较新的 JDK 版本中 EA 和堆栈分配优化的当前状态是什么?其他 Java VM(例如 OpenJ9)是否有不同的规则?
java jvm compiler-optimization escape-analysis stack-allocation