gpt4 book ai didi

Java JIT - 死代码消除的范围?

转载 作者:行者123 更新时间:2023-11-30 09:36:01 25 4
gpt4 key购买 nike

我想知道 Java JIT 编译的使用。我的理解是它应该尝试编译出“死代码”。我想知道什么是死代码。

例如 - 假设我将名为 debug 的运行时属性设置为 false。如果我的程序有一些代码来获取该属性,然后基于它执行方法,我想知道什么将被归类为死代码。

public static final boolean DEBUG

static {
DEBUG = System.getProperties().containsKey("debug.enabled");
}

public static void logDebug(String msg) {
if (DEBUG) {
System.out.println("My Debug Message");
}
}

public static void main(String args) {
// 1) Check if DEBUG is true and log if
// it is.
//
if (DEBUG) {
System.out.println("My Debug Message");
}

// 2) Call a method to perform logging, let it check
// DEBUG
//
logDebug("My Second Debug Message");

}

在 main 中,第一个 if block 检查 DEBUG。因为它是假的,我假设 JIT 会意识到这个 block 永远不会执行,所以会把它编译成死代码。

我想知道,如果方法 logDebug 也会发生同样的情况 - JVM 是否仍会每次都进入该方法,还是它会理解该方法中没有发生任何事情并因此优化它?

也许我对 JIT 工作原理的理解完全错误?

最佳答案

JIT 并不总能完全消除无用代码。

相反,它所做的是优化不太可能发生的情况,因此它的成本几乎为零。这是因为 CPU 可以通过分支执行代码的推测执行,如果不采用该分支,则只会产生名义成本。即使一个分支仅在某些时候被采用它也会这样做(即它必须选择一个分支作为可能被采用的分支)

如果由于某种原因这种情况发生变化,代码仍然会正确运行,但速度相对较慢。 JIT 可以检测到它所做的优化假设已经改变并重新优化代码。在 -XX:+PrintCompilation 中,您可以看到它转储了之前编译的方法并重新编译它。

简而言之,它使死代码几乎没有成本。

关于Java JIT - 死代码消除的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11010276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com