我想知道 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 块检查 DEBUG。因为它是错误的,我假设 JIT 会意识到这个块永远不会执行,所以会将它编译为死代码。
我想知道,如果方法 logDebug 也会发生同样的情况 - JVM 是否仍会每次都进入该方法,或者它会理解该方法中没有发生任何事情并因此对其进行优化?
也许我对 JIT 工作原理的理解是完全错误的?