官术网_书友最值得收藏!

局部變量表與操作數棧

在了解線程、棧與棧楨的關系后,我們還要重點關注棧楨中的局部變量表與操作數棧,這兩個數據結構是字節碼指令執行所依賴的。

局部變量表

局部變量表存儲方法中聲明的變量、方法參數,如果是非靜態方法還會存放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框架操作字節碼時,要注意合理設置這個結構的大小。

主站蜘蛛池模板: 鄢陵县| 云霄县| 涿鹿县| 霸州市| 资源县| 泊头市| 新巴尔虎左旗| 邯郸县| 鲁山县| 剑川县| 阿克苏市| 松阳县| 汨罗市| 巨野县| 长泰县| 万安县| 枞阳县| 双鸭山市| 和林格尔县| 濮阳市| 蕉岭县| 潜山县| 垦利县| 廉江市| 太仆寺旗| 嵊泗县| 伊吾县| 耒阳市| 黄石市| 当涂县| 岑巩县| 当阳市| 本溪| 教育| 碌曲县| 乳山市| 青龙| 遂宁市| 肃南| 苍山县| 师宗县|