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

2022-09-01 10:20:53

我有一段简单的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编译器不进行这种优化来使用最小的局部变量呢?


答案 1

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

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


答案 2

仅仅是因为 Java 从即时编译器中获得了性能。

您在 Java 源代码中执行的操作,甚至在类文件中显示的内容,都不能在运行时实现性能。当然,你不应该忽视这一部分,而只是在不犯“愚蠢错误”的意义上。

含义:jvm在运行时决定一个方法是否值得翻译成(高度优化的!)机器代码。如果jvm决定“不值得优化”,为什么通过在那里进行大量优化来使javac更复杂,更慢?另外:传入的字节代码越简单和基本,JIT就越容易分析和改进该输入!


推荐