java虚拟机指令dup详解

 更新时间:2021年09月14日 10:35:13   作者:CLAYJJ  
这篇文章主要为大家详细介绍了java虚拟机指令dup,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家介绍了java虚拟机指令dup,供大家参考,具体内容如下

举个例子:

public class ExceptionTest{

  void cantBeZero(int i) throws Exception{
    throw new Exception();

  }

}

上面代码编译后的字节码指令如下:

void cantBeZero(int) throws java.lang.Exception;
  descriptor: (I)V
  flags:
  Code:
   stack=2, locals=2, args_size=2
    0: iload_1
    1: ifne     12
    4: new      #2         
    // class java/lang/Exception
    7: dup
    8: invokespecial #3         
    // Method java/lang/Exception."<init>":()V
    11: athrow
    12: return

1) 其中new指令在java堆上为Exception对象分配内存空间,并将地址压入操作数栈顶;

2) 然后dup指令为复制操作数栈顶值,并将其压入栈顶,也就是说此时操作数栈上有连续相同的两个对象地址;

3) invokespecial指令调用实例初始化方法<init>:()V,注意这个方法是一个实例方法,所以需要从操作数栈顶弹出一个this引用,也就是说这一步会弹出一个之前入栈的对象地址;

4) athrow指令从操作数栈顶取出一个引用类型的值,并抛出;

5) 最后由return指令结束方法。

从上面的五个步骤中可以看出,需要从栈顶弹出两个实例对象的引用,这就是为什么会在new指令下面有一个dup指令,其实对于每一个new指令来说一般编译器都会在其下面生成

一个dup指令,这是因为实例的初始化方法肯定需要用到一次,然后第二个留给程序员使用,例如给变量赋值,抛出异常等,如果我们不用,那编译器也会生成dup指令,在初始化方法调用完成后再从栈顶pop出来。例如我们仅仅创建一个对象而不做任何操作,例如:

 void cantBeZero(int i) throws Exception{
     new Exception();
 
  }

上面的代码仅仅创建了一个Exception对象,而没有做任何操作。

其编译后的字节码指令如下:

void cantBeZero(int) throws java.lang.Exception;
  descriptor: (I)V
  flags:
  Code:
   stack=2, locals=2, args_size=2
    0: new      #2         // class java/lang/Exception
    3: dup
    4: invokespecial #3     // Method java/lang/Exception."<init>":()V
    7: pop
    8: return

也会生成一个dup指令,只不过在调用完实例初始化方法后,将重复的实例引用又pop出栈了。不过这种情况基本不会出现在我们的代码中,因为我们创建的每一个对象都应该是有用的。

通过上面的例子你应该比较清楚的理解了为什么创建对象时总会有一个dup指令了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用mybatis格式化查询出的日期

    使用mybatis格式化查询出的日期

    这篇文章主要介绍了使用mybatis格式化查询出的日期,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot如何使用自定义注解实现接口限流

    SpringBoot如何使用自定义注解实现接口限流

    这篇文章主要介绍了SpringBoot如何使用自定义注解实现接口限流,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java分布式学习之Kafka消息队列

    Java分布式学习之Kafka消息队列

    Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据
    2022-07-07
  • Idea之没有网络的情况下创建SpringBoot项目的方法实现

    Idea之没有网络的情况下创建SpringBoot项目的方法实现

    本文主要介绍了Idea之没有网络的情况下创建SpringBoot项目的方法实现,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • springboot+mybatis如何屏蔽掉mybatis日志

    springboot+mybatis如何屏蔽掉mybatis日志

    这篇文章主要介绍了springboot+mybatis如何屏蔽掉mybatis日志问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 史上最佳springboot Locale 国际化方案

    史上最佳springboot Locale 国际化方案

    今天给大家分享史上最佳springboot Locale 国际化方案,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-08-08
  • java实现带有背景图片的窗体

    java实现带有背景图片的窗体

    这篇文章主要为大家详细介绍了java实现带有背景图片的窗体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • Java NIO 中 Selector 解析

    Java NIO 中 Selector 解析

    这篇文章主要介绍了Java NIO 中 Selector,Selector即选择器,选择器提供选择执行已经就绪的任务的能力即为翻译为多路复用,下面文章对Selector详细介绍内容,需要的小伙伴可以参考一下
    2022-02-02
  • 详解Java实现批量压缩图片裁剪压缩多种尺寸缩略图一键批量上传图片

    详解Java实现批量压缩图片裁剪压缩多种尺寸缩略图一键批量上传图片

    这篇文章主要介绍了Java实现批量压缩图片裁剪压缩多种尺寸缩略图一键批量上传图片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java中的static关键字深入理解

    Java中的static关键字深入理解

    这篇文章主要介绍了Java中的static关键字深入理解,文字和代码列举了实际例子,有感兴趣的同学可以研究下
    2021-03-03

最新评论