【发布时间】:2018-12-21 10:28:26
【问题描述】:
假设我在 java 中有一个方法调用站点。什么是等效的 jvm 字节码(除了转换为 invokevirtual/static 等的调用)?我对将接收器加载到堆栈上的命令更感兴趣。
-显然是加载了一个命令。
-另一个可能是另一个调用返回堆栈上的 refobject
-三、新指令。 (例如 new A().foo()。它被复制了。但是被复制的被构造函数消耗)
-四个,也许(??)重复。 (当有 a.foo(); a.bar(); 有没有机会编译器会产生 aload 然后 dup 而不是 aload aload?)
我最大的问题是 rest dup 命令。因为他们有点洗牌。 javac什么时候产生它们?编译调用站点时是否使用它们?
我试图找到没有运气的文档。然后找到了源代码,但要花几天时间才能深入研究。我相信Code.java and Gen.java 文件负责翻译/编译过程。
【问题讨论】:
-
可以使用javap命令查看你的类中使用的jvm字节码---docs.oracle.com/javase/7/docs/technotes/tools/windows/…
-
是的,但它不会涵盖所有可能性。我不能确定我的示例是否涵盖了所有内容
-
正如您自己指出的,
javac使用dup进行构造函数调用。通常,当您取消引用同一个变量时,它不使用dup。变量访问将始终编译为变量访问。但反过来,它可能会添加未出现在源代码中的合成变量。堆栈操作相当少见。但是一个例子是objArray[index] += "string",它使用dup2(在JDK11中)来克隆数组引用和索引,因为更新需要aaload和aastore。另一种情况是(variable = expression).method();
标签: java jvm javac method-call