java虛擬機(jī)指令dup詳解
本文實例為大家介紹了java虛擬機(jī)指令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指令為復(fù)制操作數(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)用完實例初始化方法后,將重復(fù)的實例引用又pop出棧了。不過這種情況基本不會出現(xiàn)在我們的代碼中,因為我們創(chuàng)建的每一個對象都應(yīng)該是有用的。
通過上面的例子你應(yīng)該比較清楚的理解了為什么創(chuàng)建對象時總會有一個dup指令了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis利用OGNL表達(dá)式處理動態(tài)sql的方法教程
這篇文章主要給大家介紹了關(guān)于Mybatis利用OGNL表達(dá)式處理動態(tài)sql的方法教程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
java實現(xiàn)圖片水平和垂直翻轉(zhuǎn)效果
這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)圖片水平和垂直翻轉(zhuǎn)效果,圖片旋轉(zhuǎn)的靈活運(yùn)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01
使用Springboot封裝好的發(fā)送post請求的工具類
本文介紹了在Springboot中封裝發(fā)送HTTP請求的工具類,并提供了普通的HTTP請求工具類代碼和Response類的使用示例,這些工具類可為開發(fā)者提供便利性和參考價值,幫助提高開發(fā)效率2024-09-09
Springboot注入成員變量HttpServletRequest的原理分析
這篇文章主要介紹了Springboot注入成員變量HttpServletRequest的原理分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
詳解springboot采用多數(shù)據(jù)源對JdbcTemplate配置的方法
在本篇文章中我們給大家詳細(xì)分享了springboot采用多數(shù)據(jù)源對JdbcTemplate配置的方法,有需要的朋友們可以學(xué)習(xí)參考下。2018-10-10
SpringBoot ApplicationListener事件監(jiān)聽接口使用問題探究
這篇文章主要介紹了SpringBoot ApplicationListener事件監(jiān)聽接口使用問題,自定義監(jiān)聽器需要實現(xiàn)ApplicationListener接口,實現(xiàn)對應(yīng)的方法來完成自己的業(yè)務(wù)邏輯。SpringBoot Application共支持6種事件監(jiān)聽2023-04-04
為什么mybatis中的SqlSession一定要關(guān)閉
這篇文章主要介紹了為什么mybatis中的SqlSession一定要關(guān)閉,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12

