java - 为什么 Java 字节码方法中使用的局部变量数量不是最经济的?

标签 java jvm javac bytecode

我有一段简单的 Java 代码:

public static void main(String[] args) {
    String testStr = "test";
    String rst = testStr + 1 + "a" + "pig" + 2;
    System.out.println(rst);
}

使用 Eclipse Java 编译器编译它,并使用 AsmTools 检查字节码。它显示:

byte code

方法中有三个局部变量。参数在插槽 0 中,而插槽 1 和 2 应该由代码使用。但我认为 2 个局部变量就足够了——无论如何,索引 0 是参数,而代码只需要一个变量。

为了看看我的想法是否正确,我编辑了文本字节码,将局部变量的数量减少到2个,并调整了一些相关说明:

edited

我用 AsmTools 重新编译了它,它工作正常!

那么为什么 Javac 或 Eclipse 编译器不做这种优化来使用最少的局部变量呢?

最佳答案

有几个原因。首先,它不是性能所必需的。 JVM 已经在运行时优化了一些东西,所以没有必要给编译器增加冗余的复杂性。

然而,这里没有人提到的另一个主要原因是调试。使字节码尽可能接近原始源代码,使其更容易调试。

关于java - 为什么 Java 字节码方法中使用的局部变量数量不是最经济的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57242587/

相关文章:

java - WebLogic 集群 - 每周重新启动所有应用程序服务器实例?

java - 如何修复 android 10 中的崩溃处理

java - System.gc() 收集仍然被局部变量引用的对象

java - 了解 Jeprofile 输出

java - java中的静态 block 和对象 block 访问

Java:如何编译代码的整个目录结构?

java - Autoconf 强制 Java 编译器版本和供应商

java - Spring 数据 MongoDB : how to partially map domain object to MongoDB?

java - 如果未访问类,是否保证 static init 不运行?

javac 错误消息不显示整个文件路径