为什么这些方法编译成汇编?

时间:2018-05-09 13:57:41

标签: java java-8 jvm

public class Inline {
    public static void main(String[] args) throws Exception {
        long upto = Long.parseLong(args[0]);
        for(int i = 0; i < upto; i++) {
            int x = inline1();
            Thread.sleep(1);
        }
    }
    public static int inline1() {
        return inline2();
    }
    public static int inline2() {
        return inline3();
    }
    public static int inline3() {
        return 4;
    }
}  

这是一个简单的例子,用于查看安全点和计数器衰减对正在编译为汇编的方法的影响。

我的理解是,通过Thread.sleep(或System.gc)调用,方法调用/后沿计数器将递减,并且永远不会超过CompileThreshold

Thread.sleep()应插入安全点,不应编译方法。但是,当我使用-XX:+PrintCompilation运行上面的示例时,我可以看到正在编译的所有方法。

我运行的代码如下:

java -XX:+PrintCompilation Inline 10000 

我的Java版本:

java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

据我所知,您在评论中链接的信息已过时。 "CompileThreshold is relative!"文章的日期为2013年,描述的是当时可用的Java版本。

如果查看Java 8和Java 9 OpenJDK源代码,您将看到文章中描述的计数器衰减代码不再存在。这可以解释为什么你没有在Java 8中看到这种效果。

(要看的地方是源代码树中的“./jdk8u/hotspot/src/share/vm/runtime/safepoint.cpp”。)