三、方法中new对象同时调用另外一个方法的JVM指令详解
package com.zhou.jvm.runtimedataAreainstructionset; /** * @author zhouyanxiang * @create 2020-08-2020/8/6-8:43 */ public class TestMethod { public static void main(String[] args) { TestMethod t = new TestMethod(); t.m(); } public void m() { int i = 200; } }
这个是main方法的Bytecode
0 new #2 <com/zhou/jvm/runtimedataAreainstructionset/TestMethod> 3 dup 4 invokespecial #3 <com/zhou/jvm/runtimedataAreainstructionset/TestMethod.<init>> 7 astore_1 8 aload_1 9 invokevirtual #4 <com/zhou/jvm/runtimedataAreainstructionset/TestMethod.m> 12 return
这个是m方法的Bytecode
0 sipush 200 3 istore_1 4 return
3.1 new
会在堆内存开辟一个对象的空间,并将对象的赋值为默认值,同时会将对象的地址值压入操作数栈
3.2 dup
dup指令全称应该是duplicate复制的意思,将操作数栈中存的对象的地址值复制一份
3.3 invokespecial
invokespecial指令就是调用初始化方法,把堆内存的对象赋值为初始值,同时将上一步复制的地址值要弹出去,为了告诉哪个对象再执行所以需要弹栈拿出去进行计算。
弹栈处理完后的结果图如下
3.4 astore_1
将地址值弹栈压入局部变量表赋值给索引为1的变量
3.5 aload_1
把局部变量表中索引为1的变量的值压入操作数栈当中
3.6 invokevirtual
invokevirtual把操作数栈的值弹栈,去另外一个操作数栈中得到值
3.7 m方法的JVM指令
0 sipush 200 3 istore_1 4 return
sipush 200是将200压入操作数栈当中
istore_1就是将200弹栈到局部变量表当中
return返回
3.8 m的return之后回到了main方法的invokevirtual指令结束