【发布时间】:2020-10-14 11:07:11
【问题描述】:
在 Java 9+ 中是否有更便宜的方法调用来保持其安全点?
JVM 会在运行时移除安全点以提高效率,但这会使分析和监控代码变得更加困难。出于这个原因,我们特意在精心挑选的地方添加了一些琐碎的调用,以确保存在安全点。
public static void safepoint() {
if (IS_JAVA_9_PLUS)
Thread.holdsLock(""); // 100 ns on Java 11
else
Compiler.enable(); // 5 ns on Java 8
}
public static void optionalSafepoint() {
if (SAFEPOINT_ENABLED)
if (IS_JAVA_9_PLUS)
Thread.holdsLock("");
else
Compiler.enable();
}
在 Java 8 上这个开销很好,但 Compiler.enable() 在 Java 9+ 中得到了优化,所以我们必须使用更昂贵的方法,或者不启用这个功能。
编辑:除了分析器,我使用safepoint() 从Thread.getStackTrace() 获得更好的细节,因此应用程序可以分析自身,例如当执行某项操作的时间过长时。
【问题讨论】:
-
Compiler.enable()是一个空的static方法,根本没有任何效果。我很惊讶它没有在您的 Java 8 运行时中得到优化。除此之外,我不确定我是否理解正确。当然,根据安全点的分析器会扭曲结果。但是您现在尝试的是在代码中插入失真,以更精确地测量已经失真的执行。 -
@Holger 这对于基于样本的分析来说较少,因为它是使用后台线程在生产中捕获为什么我的延迟太高的配置文件。