java - Java 字节码中存在多个静态 block 会发生什么情况?

标签 java bytecode static-block

这是一个非常基本的 Java 应用程序,仅包含一个。在该类中,有一个 main 方法和两个 static block 。

class Test {
    public static void main(String args[]) {
        System.out.println("Main");
    }

    static {
        int a = 10;
    }

    static {
        int a = 20;
    }
}

这是编译该应用程序生成的字节码。我不明白静态 block 发生了什么:

static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=1, args_size=0
         0: bipush        10
         2: istore_0
         3: bipush        20
         5: istore_0
         6: return
      LineNumberTable:
        line 34: 0
        line 37: 3
        line 38: 6

我的问题是:第二个静态 block 在哪里?如果它们合并,那么 JVM 如何区分两个 block 包含的变量,因为两个 block 都具有相同名称和类型的变量?

最佳答案

在这种情况下,您可以看到两个 block 仍然存在。常数10和常数20分别出现在不同的行上。然而,这些 block 是“合并”的,因为它们只是按顺序执行。由于您没有对相关变量执行任何操作,因此两者都只是写入堆栈顶部(我认为这就是 istore_0 所做的),然后被忽略。

Code:
  stack=1, locals=1, args_size=0
     0: bipush        10
     2: istore_0
     3: bipush        20
     5: istore_0
     6: return

编辑:istore_0 将值存储到局部变量。两个 a 是相同的变量。这是因为它们不同时使用,因此编译器只是尝试提高效率并为不同时使用的变量重用堆栈空间。

从概念上讲,两者是不同的变量。如果以后可以使用第一个 a 的值,编译器永远不会这样做。但实际上,它们已被合并以节省空间。这只是一个简单的内存优化。

关于java - Java 字节码中存在多个静态 block 会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49744173/

相关文章:

java - 为什么对象类有静态 block ?

css - Magento : How to put already created static block after all product listing and end of the sidebar in magento?

java - 如何在java程序中使用MongoExport命令?

java - Android 图像预览与图库/相机不同

java - 无法使用 Eclipse 在 Java 中进行调试

java - 在哪里可以找到 BCEL 6.0?如何修改它并添加补丁?

java - Java中的字节码分析

java - 有没有关于加载时间字节码转换而不在java命令行中指定javaagent选项的解决方案

java - 如何在java中使用正则表达式替换字符串中的字符?

c++ - 在静态初始化列表之前预处理变量