【发布时间】:2020-11-08 15:42:39
【问题描述】:
OnStackTest.java
public class OnStackTest {
public static void alloc() {
User u = new User();
u.id = 5;
u.name = "test";
}
public static void main(String[] args) throws InterruptedException {
long b = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
Thread.sleep(50);
alloc();
}
long e = System.currentTimeMillis();
System.out.println(e - b);
}
}
用户.java
public class User {
public int id = 0;
public String name = "";
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
}
JVM 标志
-server -Xmx10m -Xms10m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:-UseTLAB -XX:+EliminateAllocations
使用jmap -histo
发现用户对象一直在堆上创建。理论上,我们不应该用标量替换用户对象,也不应该在堆上创建对象?
【问题讨论】:
-
据我所知,此选项默认启用,因此显式启用不会有任何区别。
-
我知道这个参数默认是开启的,但是结果不正确