小编NiM*_*Thr的帖子

为什么getSum没有被热点jvm内联?

以下是我尝试从" 逃避分析 "主题的Java Performance:The Definitive Guide,第97页重现的示例.这可能是应该发生的事情:

  1. getSum()必须变得足够热并且使用适当的JVM参数必须将其内联到调用者中main().
  2. 由于两者listsum变量都没有从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)

java jit jvm-hotspot escape-analysis

8
推荐指数
1
解决办法
156
查看次数

标签 统计

escape-analysis ×1

java ×1

jit ×1

jvm-hotspot ×1