以下是我尝试从" 逃避分析 "主题的Java Performance:The Definitive Guide,第97页重现的示例.这可能是应该发生的事情:
getSum()必须变得足够热并且使用适当的JVM参数必须将其内联到调用者中main().list和sum变量都没有从main()方法中转义,因此可以将它们标记为,NoEscape因此JVM可以使用堆栈分配而不是堆分配.但是我通过jitwatch运行它,结果显示getSum()编译成本机程序集并且没有内联main().更不用说因此堆栈分配也没有发生.
我在这里做错了什么?(我已将整个代码和热点日志放在这里.)
这是代码:
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.stream.IntStream;
public class EscapeAnalysisTest {
private static class Sum {
private BigInteger sum;
private int n;
Sum(int n) {
this.n = n;
}
synchronized final BigInteger getSum() {
if (sum == null) {
sum = BigInteger.ZERO;
for (int i = 0; i < …Run Code Online (Sandbox Code Playgroud)