通过查看api文档,翻译可知:
- dup指令复制操作数堆栈的顶部值,并将复制的值压入操作数堆栈
- dup只能用于操作value是第一类计算类型的值
我们通过一个例子具体学习一下这个指令,如图:
我们新建了一个JMMTest对象,语句为:
JMMTest test = new JMMTest();
对应字节码中的语句为:
new #5 <com/xinyun/httpclent/test/jmm/test/JMMTest>
dup
invokespecial #6 <com/xinyun/httpclent/test/jmm/test/JMMTest.<init>>
astore 6
我们来一句句的解析这些指令:
- new指令在java堆上为JMMTest对象分配内存空间,并将地址压入操作数栈顶;
- dup指令复制操作数栈顶值,并将其压入栈顶,此时操作数栈上有连续相同的两个对象地址;
- invokespecial指令调用实例初始化方法<init>:()V,注意这个方法是一个实例方法,所以需要从操作数栈顶弹出一个this引用,也就是说这一步会弹出一个之前入栈的对象地址;
- astore指令将对象地址赋值给index为6(name为test)的变量