成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JVM系列(1)-變量

haobowd / 1711人閱讀

摘要:我們對(duì)做下拆解,一個(gè)常量,一個(gè)變量。因?yàn)閹в袃蓚€(gè)參數(shù),所以在局部變量索引索引為的位置插入,在索引為的位置插入。

前言

這段時(shí)間一直在看JVM相關(guān)的書籍,雖然有點(diǎn)難,至少到目前為止還沒有放棄。寫這篇文章的目的:當(dāng)做自己這段時(shí)間學(xué)習(xí)的小回顧。本章主要通過幾個(gè)代碼片段,分析下局部變量表與操作數(shù)棧之間的數(shù)據(jù)傳遞關(guān)系,重點(diǎn)講解iload,istore,iconst_,iadd命令

提前了解 JVM的幾個(gè)概念

局部變量表:每個(gè)棧幀內(nèi)部都包含一組稱為局部變量表的變量列表

操作數(shù)棧:每個(gè)棧幀內(nèi)部都包含一個(gè)操作數(shù)棧

iconst_0:把int型的0值壓入操作數(shù)棧

iload:將一個(gè)局部變量加載到操作數(shù)棧上

istore:將一個(gè)數(shù)值從操作數(shù)棧上存儲(chǔ)到局部變量表中

iadd:返回棧頂?shù)膬蓚€(gè)元素做加法運(yùn)算,并加結(jié)果壓棧

如何使用dos查看字節(jié)碼文件

首先通過dos進(jìn)入TestApp.class所在的目錄,然后運(yùn)行命令javap -c TestApp,即可看到編譯后的字節(jié)碼文件

程序片段一

以下是一個(gè)java源代碼

public void test1(){      
    int c=0;              
}                         

編譯后的字節(jié)碼

  public void test1();
    Code:
       0: iconst_0
       1: istore_1
       2: return

代碼分析

因?yàn)?b>test1()是一個(gè)實(shí)例方法,所以在局部變量表中,索引為0的位置會(huì)保存該方法所在類的引用(this),所以才會(huì)出現(xiàn)istore_1而不是istore_0。

我們對(duì)int c = 0做下拆解,一個(gè)常量0,一個(gè)變量c。

0: iconst_0   //將常量0壓入操作數(shù)棧
1: istore_1   //將棧頂出棧,即c=0
2: return      //因?yàn)槭莢oid,沒有返回值
程序片段二

Java源代碼如下

public static void test2(){    
    int c=0;                   
}                              

編譯后的字節(jié)碼文件

  public static void test2();
    Code:
       0: iconst_0
       1: istore_0
       2: return

分析

因?yàn)?b>test2()是一個(gè)靜態(tài)的方法,不會(huì)在局部變量表中插入任何數(shù)據(jù)。所以你看到的是istore_0而不是像程序片段一中的istore_1。其他分析跟程序片段一相同

程序片段三

java源代碼

public int test3(){         
    int c=0;                
    return c;               
}                           

編譯后的字節(jié)碼

  public int test3();
    Code:
       0: iconst_0
       1: istore_1
       2: iload_1
       3: ireturn

分析

0: iconst_0        //將常量0壓棧
1: istore_1     //將棧頂出棧,及c=0
2: iload_1      //將變量c壓入棧頂
3: ireturn        //返回棧定元素
程序片段四

Java源代碼

public int test4(int a,int b){       
    int c=0;                         
    return a+b;                      
}                                    

編譯后的字節(jié)碼

  public int test4(int, int);
    Code:
       0: iconst_0
       1: istore_3
       2: iload_1
       3: iload_2
       4: iadd
       5: ireturn

** 分析

因?yàn)?b>test4(int a,int b)是實(shí)例方法,所以在局部變量表索引為0的位置會(huì)插入this。
因?yàn)?b>test4(int a,int b)帶有兩個(gè)參數(shù),所以在局部變量索引索引為1的位置插入a,在索引為2的位置插入b。

0: iconst_0        //將常量0壓棧
1: istore_3        //將棧頂出棧,即c=0,將c存儲(chǔ)到局部變量表索引為3的位置
2: iload_1        //將局部變量表中索引為1的變量壓棧,即a壓棧
3: iload_2        //將局部變量表中索引為2的變量壓棧,即b壓棧
4: iadd            //將棧頂兩個(gè)元素出棧,做加法,然后把結(jié)果再入棧(即a,b出棧,將a+b入棧)
5: ireturn        //返回a+b的值
程序片段五

java源代碼

public int test5(int a,int b){    
    int c=0;                      
    c= a+b;                       
    return c;                     
}                                 

編譯后的字節(jié)碼

  public int test5(int, int);
    Code:
       0: iconst_0
       1: istore_3
       2: iload_1
       3: iload_2
       4: iadd
       5: istore_3
       6: iload_3
       7: ireturn

分析

0: iconst_0        //將常量0壓棧
1: istore_3        //將棧頂出棧,及c=0
2: iload_1        //從局部變量表中加載索引為1的變量壓棧,即a壓棧
3: iload_2        //從局部變量表中加載索引為2的變量壓棧,即b壓棧
4: iadd            //將棧頂兩個(gè)元素出棧,做加法,然后將結(jié)果壓棧,及a+b壓棧
5: istore_3        //將棧頂元素出棧,并保存到局部變量表中,即c=a+b
6: iload_3        //從局部變量表中加載索引為3的變量壓棧,即c壓棧
7: ireturn        //返回棧頂元素,即返回c

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66815.html

相關(guān)文章

  • 從一無所知到無所不知————jvm系列1

    摘要:學(xué)習(xí)能更深入的理解這門語言,能理解語言底層的執(zhí)行過程,深入到字節(jié)碼層次。 目錄 ? 前言 程序的運(yùn)行 1.JVM類加載機(jī)制 ①一般在什么情況下會(huì)去加載一個(gè)類?也就是說,什么時(shí)候.class字節(jié)碼文件中加載這個(gè)類到JVM內(nèi)存里來? ②驗(yàn)證、準(zhǔn)備、初始化 ③初始化 2.類加載器和雙親委派機(jī)制 ...

    Betta 評(píng)論0 收藏0
  • 《深入理解java虛擬機(jī)》學(xué)習(xí)筆記系列——java內(nèi)存區(qū)域劃分

    摘要:運(yùn)行時(shí)數(shù)據(jù)區(qū)域的學(xué)習(xí),是學(xué)習(xí)以及機(jī)制的基礎(chǔ),也是深入理解對(duì)象創(chuàng)建及運(yùn)行過程的前提。了解內(nèi)存區(qū)域劃分,是學(xué)習(xí)概念的前提。 Java 運(yùn)行時(shí)數(shù)據(jù)區(qū)域的學(xué)習(xí),是學(xué)習(xí) jvm 以及 GC 機(jī)制的基礎(chǔ),也是深入理解 java 對(duì)象創(chuàng)建及運(yùn)行過程的前提。廢話不多說,直接進(jìn)入正題: 一張圖總結(jié) showImg(https://segmentfault.com/img/bVOMAn?w=685&h=5...

    史占廣 評(píng)論0 收藏0
  • 【Java系列】從字節(jié)碼角度深度理解Java函數(shù)調(diào)用傳參方式

    摘要:下文將從字節(jié)碼的角度,分析中基本類型傳參和對(duì)象傳參。主函數(shù)執(zhí)行時(shí),操作棧會(huì)推入主函數(shù)棧幀,其中包含了主函數(shù)的局部變量表,字節(jié)碼,返回值等信息。主函數(shù)的棧幀會(huì)被推入棧,成為當(dāng)前操作棧。 個(gè)人網(wǎng)站地址: http://kailuncen.me/2017/06/0... 一個(gè)小問題 在開源中國(guó)看到這樣一則問題 https://www.oschina.net/quest...,其中的變量a前...

    LdhAndroid 評(píng)論0 收藏0
  • JVM系列(一):深入詳解JVM 內(nèi)存區(qū)域總結(jié)!

    摘要:一內(nèi)存區(qū)域虛擬機(jī)在運(yùn)行時(shí),會(huì)把內(nèi)存空間分為若干個(gè)區(qū)域,根據(jù)虛擬機(jī)規(guī)范版的規(guī)定,虛擬機(jī)所管理的內(nèi)存區(qū)域分為如下部分方法區(qū)堆內(nèi)存虛擬機(jī)棧本地方法棧程序計(jì)數(shù)器。前言 在JVM的管控下,Java程序員不再需要管理內(nèi)存的分配與釋放,這和在C和C++的世界是完全不一樣的。所以,在JVM的幫助下,Java程序員很少會(huì)關(guān)注內(nèi)存泄露和內(nèi)存溢出的問題。但是,一旦JVM發(fā)生這些情況的時(shí)候,如果你不清楚JVM內(nèi)存的...

    Aldous 評(píng)論0 收藏0
  • 【效率專精系列】幾種常見的JVM熱部署技術(shù)及實(shí)現(xiàn)難點(diǎn)淺談

    摘要:而熱部署技術(shù)能夠幫助開發(fā)人員減少重新部署的等待時(shí)間。本文的目的為調(diào)研熱部署的技術(shù)現(xiàn)狀及其對(duì)開發(fā)效率的幫助,并簡(jiǎn)單梳理其技術(shù)實(shí)現(xiàn)的難點(diǎn)。熱部署技術(shù)總結(jié)熱部署目前有多種技術(shù)實(shí)現(xiàn)官方開源商業(yè)。 開發(fā)、自測(cè)、聯(lián)調(diào)期間代碼可能會(huì)被頻繁地修改,通常即使只增加了一行代碼,都需要重啟容器以檢查執(zhí)行效果。而熱部署技術(shù)能夠幫助開發(fā)人員減少重新部署的等待時(shí)間。本文的目的為調(diào)研熱部署的技術(shù)現(xiàn)狀及其對(duì)開發(fā)效率的...

    dongfangyiyu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<