Compiler construction java编译器能否从以下场景中消除死代码?

Compiler construction java编译器能否从以下场景中消除死代码?,compiler-construction,javac,dead-code,Compiler Construction,Javac,Dead Code,(问题#0:java编译器是否默认消除死代码?) 问题#1:假设我有以下一段代码(这段代码是人工生成的,所以我没有太多控制权),编译器能帮我消除死代码吗 static void foo(final Object o) { if (o == null) { // do something } else { // do something if (o == nul

(问题#0:java编译器是否默认消除死代码?)

问题#1:假设我有以下一段代码(这段代码是人工生成的,所以我没有太多控制权),编译器能帮我消除死代码吗

    static void foo(final Object o)
    {
        if (o == null) {
            // do something
        }
        else {
            // do something

            if (o == null) { // this condition is never gonna be true
                // do something
            }
            else {
                // do something
            }
        }
    }
javac
(至少来自OpenJDK)并没有消除死代码,除了用于模拟其他语言的条件编译的编译时常量分支(参见本章末尾的示例)

然而,优化JVM是非常明智的。热点(OpenJDK JIT)可能会也可能不会传播
o!=此代码中的null
约束,但它会通过分析注意到内部的
o==null
测试永远不会为真,并避免为该分支发出代码(将其变成一个不常见的陷阱)。而且总是被观察到为false的null检查非常便宜,因为它们被折叠到加载指令中,使用segfaults检查null;如果曾经看到null,JVM将查看出错的指令地址,从正确的位置抛出NullPointerException,并将取消优化到显式分支。(请参阅有关热点性能技巧的更多信息。)因此,即使它不传播路径约束,它仍将有效地删除该分支

如果您关心的是运行时性能,那么您根本不应该担心这一点,尤其是在没有显示问题的分析信息的情况下

如果您只需要小的.class文件,那么应该使用ProGuard之类的优化器,尽管我不知道它是否具有优化此特定模式所需的数据流分析