Java虛擬機器棧,java虛擬機器

來源:互聯網
上載者:User

Java虛擬機器棧,java虛擬機器

  Java Virtual Machine Stacks,線程私人,生命週期與線程相同,描述的是Java方法執行的記憶體模型:每一個方法執行的同時都會建立一個棧幀(Stack Frame),由於儲存局部變數表、運算元棧、動態連結、方法出口等資訊。每一個方法的執行就對應著棧幀在虛擬機器棧中的入棧,出棧過程。

  • 局部變數表:
    • 存放編譯期可知的各種基礎資料型別 (Elementary Data Type)、對象參考型別和returnAddress類型(指向一條位元組碼指令的地址:函數返回地址)。
    • long、double佔用兩個局部變數控制項Slot。
    • 局部變數表所需的記憶體空間在編譯期確定,當進入一個方法時,方法在棧幀中所需要分配的局部變數控制項是完全確定的,不可動態改變大小。
    • 異常:線程請求的棧幀深度大於虛擬機器所允許的深度---StackOverFlowError,如果虛擬機器棧可以動態擴充(大部分虛擬機器允許動態擴充,也可以設定固定大小的虛擬機器棧),但是無法申請到足夠的記憶體---OutOfMemorError。
  • 運算元棧:

    • 後進先出LIFO,最大深度由編譯期確定。棧幀剛建立使,運算元棧為空白,執行方法操作時,運算元棧用於存放JVM從局部變數表複製的常量或者變數,提供提取,及結果入棧,也用於存放調用方法需要的參數及接受方法返回的結果。
    • 運算元棧可以存放一個jvm中定義的任意資料類型的值。
    • 在任意時刻,運算元棧都一個固定的棧深度,基本類型除了long、double佔用兩個深度,其它佔用一個深度
  • 動態串連:

          每個棧幀都包含一個指向運行時常量池中該棧幀所屬方法的引用,持有這個引用是為了支援方法調用過程中的動態串連。Class檔案的常量池中存在有大量的符號引用,位元組碼中的方法調用指令就以常量池中指向方法的符號引用為參數。這些符號引用,一部分會在類載入階段或第一次使用的時候轉化為直接引用(如final、static域等),稱為靜態解析,另一部分將在每一次的運行期間轉化為直接引用,這部分稱為動態串連。

  • 方法返回地址:
    • 當一個方法被執行後,有兩種方式退出該方法:執行引擎遇到了任意一個方法返回的位元組碼指令或遇到了異常,並且該異常沒有在方法體內得到處理。無論採用何種退出方式,在方法退出之後,都需要返回到方法被調用的位置,程式才能繼續執行。方法返回時可能需要在棧幀中儲存一些資訊,用來協助恢複它的上層方法的執行狀態。一般來說,方法正常退出時,調用者的PC計數器的值就可以作為返回地址,棧幀中很可能儲存了這個計數器值,而方法異常退出時,返回地址是要通過異常處理器來確定的,棧幀中一般不會儲存這部分資訊。
    • 方法退出的過程實際上等同於把當前棧幀出棧,因此退出時可能執行的操作有:恢複上層方法的局部變數表和運算元棧,如果有傳回值,則把它壓入調用者棧幀的運算元棧中,調整PC計數器的值以指向方法調用指令後面的一條指令。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.