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)
我错过了什么吗?
答案 0 :(得分:3)
据我所知,您在评论中链接的信息已过时。 "CompileThreshold is relative!"文章的日期为2013年,描述的是当时可用的Java版本。
如果查看Java 8和Java 9 OpenJDK源代码,您将看到文章中描述的计数器衰减代码不再存在。这可以解释为什么你没有在Java 8中看到这种效果。
(要看的地方是源代码树中的“./jdk8u/hotspot/src/share/vm/runtime/safepoint.cpp”。)