- Java虛擬機字節碼:從入門到實戰
- 吳就業
- 777字
- 2021-01-08 19:08:23
局部變量表與操作數棧
在了解線程、棧與棧楨的關系后,我們還要重點關注棧楨中的局部變量表與操作數棧,這兩個數據結構是字節碼指令執行所依賴的。
局部變量表
局部變量表存儲方法中聲明的變量、方法參數,如果是非靜態方法還會存放this引用。局部變量表的大小是固定的,在編譯時就已經確定。這也是我們在操作字節碼時需要注意的一點,我們需要計算方法的局部變量表需要多大,如果設置過大就會造成內存資源的浪費。
局部變量表的結構是一個數組,數組的單位是Slot(變量槽),Slot的大小是多少個字節由虛擬機決定。在32位的HotSpot虛擬機中,一個Slot槽的大小是4個字節,而在64位的HotSpot虛擬機中,一個Slot槽的大小是8個字節,在開啟指針壓縮的情況下,一個Slot槽的大小是4個字節。局部變量表的結構如圖1.8所示。

圖1.8 局部變量表結構
在方法中new一個對象是否會將對象的引用存入局部變量表?try-catch塊,catch括號中的異常是否存在局部變量表?使用build構造者模式時,鏈式調用方法會不會每次調用都將返回的對象先存儲到局部變量表?這些問題將在第三章解答。
操作數棧
操作數棧與局部變量表一樣,大小也是固定的,也是在編譯期確定,單位也是Slot。但與局部變量不一樣的是,它并不是由多少個局部變量決定棧的深度的,與需要傳遞最多參數的方法調用有很大關系。因此,操作數棧的深度相對來說比較難確定。
操作數棧用于存儲執行字節碼指令所需要的參數。比如獲取對象自身的字段,需要先將this引用壓入棧頂,再執行getfield字節碼指令;比如執行new指令后,棧頂會存放該new指令返回的對象的引用。操作數棧的結構如圖1.9所示。

圖1.9 操作數棧結構
局部變量表與操作數棧大小的設置,也會影響到棧楨的大小,從而影響棧所能容納的棧楨的最大數量。以前面棧溢出的例子說明,默認1M大小的棧大概能調用六千次的遞歸求和方法,而如果遞歸方法中再寫得復雜些,也會導致調用次數的下降。使用ASM框架操作字節碼時,要注意合理設置這個結構的大小。
- 在最好的年紀學Python:小學生趣味編程
- Python for Secret Agents:Volume II
- Scratch 3.0少兒編程與邏輯思維訓練
- Ray分布式機器學習:利用Ray進行大模型的數據處理、訓練、推理和部署
- Android NDK Beginner’s Guide
- Backbone.js Blueprints
- MySQL數據庫管理與開發實踐教程 (清華電腦學堂)
- 軟件測試技術指南
- Python編程從0到1(視頻教學版)
- 硅谷Python工程師面試指南:數據結構、算法與系統設計
- The Professional ScrumMaster’s Handbook
- 奔跑吧 Linux內核
- Modernizing Legacy Applications in PHP
- DevOps 精要:業務視角
- Spring Boot從入門到實戰