如果我不';不要在Java中使用局部变量

如果我不';不要在Java中使用局部变量,java,compiler-construction,jvm,Java,Compiler Construction,Jvm,我不知道这两种方法有什么不同 private int getSum(int a, int b) { int total = a + b; return total; } private int getSum2(int a, int b) { return a+b; } 我学到的是,编译器或解释器会自动优化这一点。是否正确?这种差异将存在于字节码中,其影响当然取决于实现 额外的int变量不能使用另一个具有间断作用域的变量的空间,因此当按字面执行(解释)时,它会将堆栈帧的

我不知道这两种方法有什么不同

private int getSum(int a, int b) {
    int total = a + b;
    return total;
}

private int getSum2(int a, int b) {
    return a+b;
}

我学到的是,编译器或解释器会自动优化这一点。是否正确?

这种差异将存在于字节码中,其影响当然取决于实现

额外的
int
变量不能使用另一个具有间断作用域的变量的空间,因此当按字面执行(解释)时,它会将堆栈帧的所需大小增加四个字节。但是,像广泛使用的HotSpot JVM这样的环境在线程启动时预先分配整个堆栈空间,并且不支持调整大小,因此在这种实现中,局部变量对内存消耗没有任何影响

您可能会说,如果向递归方法添加一个局部变量,那么所需的额外内存可能会增加,从而通过几次调用(在解释模式下)减少最大递归深度,但正如中所讨论的,最大递归深度中已经存在一个大于该值的不确定性

这个答案还演示了编译/优化对所需堆栈跟踪的影响,在示例中,将所需的堆栈空间减少了六倍。当您的方法成为热点时,优化器将对其进行检查,其框中的一个工具是转换为,它只知道用于对数据传输建模的变量。换句话说,这些变体之间的差异已经在中间表示中消除。在生成本机代码时,这些值很可能映射到CPU寄存器,因此结果根本不需要堆栈空间


尽管更可能的是,每次操作与调用方所做的任何操作融合时,这样一个小方法都会内联到调用方中,从而生成我们无法通过查看该方法预测的代码。在任何一种情况下,是否使用临时局部变量都是无关紧要的。

如果您有这种倾向,您可以自己检查字节码并找出答案。是的,我希望在第一个版本上进行某种优化。@TimBiegeleisen。你能告诉我怎么做吗?
javap-cmyclass.class
请注意,JVM在运行时也会优化代码,所以字节码只是第一个信息,但执行环境可以做更多的优化。