目錄
虛擬機棧概述
每個線程會創建一個虛擬機棧,其內部保存一個個的棧幀,對應着一次次的Java方法調用,生命週期和線程一樣
優點是跨平臺,指令集小,編譯器容易實現,缺點是性能下降,實現同樣的功能需要更多的指令
它主要保存局部變量(8種基本數據類型,對象的引用地址),部分結果,並參與方法的調用和返回
棧是一種快速有效的分配存儲方式,訪問速度僅次於程序計數器,每個方法的執行伴隨着出棧和進棧,不存在垃圾回收問題
棧的存儲結構和運行原理
棧中存儲的是什麼
棧運行原理
棧楨的內部結構
字節碼中方法內部結構的剖析
需要在IDEA添加一個插件 jclasslib
mian方法解析
ByteCode:字節碼指令
Exception table :拋出的異常
Misc: Codec length:字節碼指令長度 Maximum local variables: 局部變量最大的長度是3(3個局部變量)
局部變量字節碼指令行號
length 表示該局部變量在方法中的範圍(start PC 和length加起來16表示 因爲這個方法字節碼指令長度也爲16))
如果是非靜態方法會有一個 this 的局部變量被創建 ,這也是爲什麼靜態方法中不允許使用this,因爲不存在this這個變量
幀棧內部結構之---局部變量表
變量槽slot的理解與演示
Index 表示的是 局部變量表中solt的索引 可以看到double 是佔據的兩個solt
幀棧內部結構之---操作數棧
操作數棧的特點
涉及操作數棧的字節碼指令執行分析
幀棧內部結構之---動態鏈接
動態鏈接的理解與常量池的作用
Constant Pool :class文件常量池
這就是所謂的動態鏈接
動態鏈接就是指向運行時常量池的方法引用
幀棧內部結構之---方法返回地址