有没有jvm复用LocalVariableTable槽的好例子?

问题描述 投票:0回答:1

我正在通过阅读Java虚拟机规范

来学习java的汇编语言

我对LocalVariableTable属性感到困惑,官方文档说当执行.class文件时,LocalVariableTable的所有插槽都可以被重用。

我无法编写任何这样编译的代码:

sipush xxx
istore_0
.....
dup
astore_0

谁能给我一些例子吗?

java jvm-hotspot decompiler
1个回答
0
投票

不存在“java的汇编语言”,因此无法使用JDK提供的工具编译出伪汇编代码。你只能使用另一个方向,用

javap
打印已编译类的字节码。

有第三方工具为 JVM 提供汇编语言,例如Krakatau,但这两者都不是标准的一部分。大多数这些语言看起来都很相似,甚至与其他工具兼容,因为它们使用 JVM 规范中相同的助记符和

javap
的输出格式作为起点。

重用变量槽是一件微不足道的事情。当局部变量具有分离作用域时,这种情况总是会发生。例如

import java.util.spi.ToolProvider;

public class ReusedVariableSlots {
    static class Example {
      public static void exampleMethod() {
          { short s = 1234; }
          { Object o = null; }
      }
      private Example() {}
  }
  public static void main(String... arg) {
      ToolProvider.findFirst("javap").ifPresentOrElse(
          javap ->javap.run(System.out, System.err, "-c", Example.class.getName()),
          () -> System.out.println("javap not found"));
  }
}

将打印类似的内容

Compiled from "ReusedVariableSlots.java"
class ReusedVariableSlots$Example {
  public static void exampleMethod();
    Code:
       0: sipush        1234
       3: istore_0
       4: aconst_null
       5: astore_0
       6: return
}

tio.run 上的在线演示

© www.soinside.com 2019 - 2024. All rights reserved.