最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java虛擬機指令dup詳解

 更新時間:2021年09月14日 10:35:13   作者:CLAYJJ  
這篇文章主要為大家詳細介紹了java虛擬機指令dup,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家介紹了java虛擬機指令dup,供大家參考,具體內(nèi)容如下

舉個例子:

public class ExceptionTest{

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

  }

}

上面代碼編譯后的字節(jié)碼指令如下:

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對象分配內(nèi)存空間,并將地址壓入操作數(shù)棧頂;

2) 然后dup指令為復制操作數(shù)棧頂值,并將其壓入棧頂,也就是說此時操作數(shù)棧上有連續(xù)相同的兩個對象地址;

3) invokespecial指令調(diào)用實例初始化方法<init>:()V,注意這個方法是一個實例方法,所以需要從操作數(shù)棧頂彈出一個this引用,也就是說這一步會彈出一個之前入棧的對象地址;

4) athrow指令從操作數(shù)棧頂取出一個引用類型的值,并拋出;

5) 最后由return指令結(jié)束方法。

從上面的五個步驟中可以看出,需要從棧頂彈出兩個實例對象的引用,這就是為什么會在new指令下面有一個dup指令,其實對于每一個new指令來說一般編譯器都會在其下面生成

一個dup指令,這是因為實例的初始化方法肯定需要用到一次,然后第二個留給程序員使用,例如給變量賦值,拋出異常等,如果我們不用,那編譯器也會生成dup指令,在初始化方法調(diào)用完成后再從棧頂pop出來。例如我們僅僅創(chuàng)建一個對象而不做任何操作,例如:

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

上面的代碼僅僅創(chuàng)建了一個Exception對象,而沒有做任何操作。

其編譯后的字節(jié)碼指令如下:

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指令,只不過在調(diào)用完實例初始化方法后,將重復的實例引用又pop出棧了。不過這種情況基本不會出現(xiàn)在我們的代碼中,因為我們創(chuàng)建的每一個對象都應該是有用的。

通過上面的例子你應該比較清楚的理解了為什么創(chuàng)建對象時總會有一個dup指令了。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

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

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

    這篇文章主要介紹了使用mybatis格式化查詢出的日期,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot如何使用自定義注解實現(xiàn)接口限流

    SpringBoot如何使用自定義注解實現(xiàn)接口限流

    這篇文章主要介紹了SpringBoot如何使用自定義注解實現(xiàn)接口限流,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java分布式學習之Kafka消息隊列

    Java分布式學習之Kafka消息隊列

    Kafka是由Apache軟件基金會開發(fā)的一個開源流處理平臺,由Scala和Java編寫。Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費者在網(wǎng)站中的所有動作流數(shù)據(jù)
    2022-07-07
  • Idea之沒有網(wǎng)絡的情況下創(chuàng)建SpringBoot項目的方法實現(xiàn)

    Idea之沒有網(wǎng)絡的情況下創(chuàng)建SpringBoot項目的方法實現(xiàn)

    本文主要介紹了Idea之沒有網(wǎng)絡的情況下創(chuàng)建SpringBoot項目的方法實現(xiàn),文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • springboot+mybatis如何屏蔽掉mybatis日志

    springboot+mybatis如何屏蔽掉mybatis日志

    這篇文章主要介紹了springboot+mybatis如何屏蔽掉mybatis日志問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 史上最佳springboot Locale 國際化方案

    史上最佳springboot Locale 國際化方案

    今天給大家分享史上最佳springboot Locale 國際化方案,本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-08-08
  • java實現(xiàn)帶有背景圖片的窗體

    java實現(xiàn)帶有背景圖片的窗體

    這篇文章主要為大家詳細介紹了java實現(xiàn)帶有背景圖片的窗體,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Java?NIO?中?Selector?解析

    Java?NIO?中?Selector?解析

    這篇文章主要介紹了Java?NIO?中?Selector,Selector即選擇器,選擇器提供選擇執(zhí)行已經(jīng)就緒的任務的能力即為翻譯為多路復用,下面文章對Selector詳細介紹內(nèi)容,需要的小伙伴可以參考一下
    2022-02-02
  • 詳解Java實現(xiàn)批量壓縮圖片裁剪壓縮多種尺寸縮略圖一鍵批量上傳圖片

    詳解Java實現(xiàn)批量壓縮圖片裁剪壓縮多種尺寸縮略圖一鍵批量上傳圖片

    這篇文章主要介紹了Java實現(xiàn)批量壓縮圖片裁剪壓縮多種尺寸縮略圖一鍵批量上傳圖片,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Java中的static關鍵字深入理解

    Java中的static關鍵字深入理解

    這篇文章主要介紹了Java中的static關鍵字深入理解,文字和代碼列舉了實際例子,有感興趣的同學可以研究下
    2021-03-03

最新評論

霍州市| 尚志市| 大洼县| 临沭县| 建始县| 汶川县| 贵定县| 隆尧县| 开平市| 东乡县| 江永县| 大悟县| 彭山县| 合川市| 炉霍县| 南通市| 子洲县| 桦南县| 延边| 紫金县| 读书| 修武县| 柞水县| 阿拉善左旗| 灵璧县| 罗田县| 蓬溪县| 施甸县| 张掖市| 扎赉特旗| 安化县| 三门峡市| 新龙县| 东安县| 永新县| 朝阳县| 临西县| 涪陵区| 滨州市| 铁岭市| 紫云|