java虛擬機(jī)指令dup詳解
本文實(shí)例為大家介紹了java虛擬機(jī)指令dup,供大家參考,具體內(nèi)容如下
舉個(gè)例子:
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對(duì)象分配內(nèi)存空間,并將地址壓入操作數(shù)棧頂;
2) 然后dup指令為復(fù)制操作數(shù)棧頂值,并將其壓入棧頂,也就是說(shuō)此時(shí)操作數(shù)棧上有連續(xù)相同的兩個(gè)對(duì)象地址;
3) invokespecial指令調(diào)用實(shí)例初始化方法<init>:()V,注意這個(gè)方法是一個(gè)實(shí)例方法,所以需要從操作數(shù)棧頂彈出一個(gè)this引用,也就是說(shuō)這一步會(huì)彈出一個(gè)之前入棧的對(duì)象地址;
4) athrow指令從操作數(shù)棧頂取出一個(gè)引用類型的值,并拋出;
5) 最后由return指令結(jié)束方法。
從上面的五個(gè)步驟中可以看出,需要從棧頂彈出兩個(gè)實(shí)例對(duì)象的引用,這就是為什么會(huì)在new指令下面有一個(gè)dup指令,其實(shí)對(duì)于每一個(gè)new指令來(lái)說(shuō)一般編譯器都會(huì)在其下面生成
一個(gè)dup指令,這是因?yàn)閷?shí)例的初始化方法肯定需要用到一次,然后第二個(gè)留給程序員使用,例如給變量賦值,拋出異常等,如果我們不用,那編譯器也會(huì)生成dup指令,在初始化方法調(diào)用完成后再?gòu)臈m攑op出來(lái)。例如我們僅僅創(chuàng)建一個(gè)對(duì)象而不做任何操作,例如:
void cantBeZero(int i) throws Exception{
new Exception();
}
上面的代碼僅僅創(chuàng)建了一個(gè)Exception對(duì)象,而沒(méi)有做任何操作。
其編譯后的字節(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
也會(huì)生成一個(gè)dup指令,只不過(guò)在調(diào)用完實(shí)例初始化方法后,將重復(fù)的實(shí)例引用又pop出棧了。不過(guò)這種情況基本不會(huì)出現(xiàn)在我們的代碼中,因?yàn)槲覀儎?chuàng)建的每一個(gè)對(duì)象都應(yīng)該是有用的。
通過(guò)上面的例子你應(yīng)該比較清楚的理解了為什么創(chuàng)建對(duì)象時(shí)總會(huì)有一個(gè)dup指令了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot如何使用自定義注解實(shí)現(xiàn)接口限流
這篇文章主要介紹了SpringBoot如何使用自定義注解實(shí)現(xiàn)接口限流,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Java分布式學(xué)習(xí)之Kafka消息隊(duì)列
Kafka是由Apache軟件基金會(huì)開發(fā)的一個(gè)開源流處理平臺(tái),由Scala和Java編寫。Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費(fèi)者在網(wǎng)站中的所有動(dòng)作流數(shù)據(jù)2022-07-07
Idea之沒(méi)有網(wǎng)絡(luò)的情況下創(chuàng)建SpringBoot項(xiàng)目的方法實(shí)現(xiàn)
本文主要介紹了Idea之沒(méi)有網(wǎng)絡(luò)的情況下創(chuàng)建SpringBoot項(xiàng)目的方法實(shí)現(xiàn),文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09
springboot+mybatis如何屏蔽掉mybatis日志
這篇文章主要介紹了springboot+mybatis如何屏蔽掉mybatis日志問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
史上最佳springboot Locale 國(guó)際化方案
今天給大家分享史上最佳springboot Locale 國(guó)際化方案,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-08-08
詳解Java實(shí)現(xiàn)批量壓縮圖片裁剪壓縮多種尺寸縮略圖一鍵批量上傳圖片
這篇文章主要介紹了Java實(shí)現(xiàn)批量壓縮圖片裁剪壓縮多種尺寸縮略圖一鍵批量上傳圖片,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03

