JVM系列【5】JVM常用指令
JVM系列筆記目錄
- 虛擬機的基礎概念
- class文件結構
- class文件載入過程
- jvm記憶體模型
- JVM常用指令
- GC與調優
指令集分類
基於暫存器的指令集
基於棧的指令集
Hotspot中的Local Variable Table相當於JVM的暫存器
運行時數據區
運行時數據區分6個部分: PC、JVM Stack、Heap、MethodArea、Native Method Stack、Direct Memory。
-
PC: 程式計數器,存放下一條指令的位置。
-
JVM Stack:執行緒獨有的棧,存放一個個棧幀(Stack Frame,每個方法對應一個棧幀。
棧幀組成:
- Local Variable Table 方法本地的參數表
- Operand Stack 操作數棧
- Dynamic Linking 動態鏈接,簡單理解為指向Runtime Constant Pool中的符號鏈接;如果沒有解釋,將符號引用解析為直接引用的過程;如果已解釋,直接用。感興趣可以閱讀下 Oracle官方JVM規範。
- Return address,返回地址,a() -> b(),方法a調用了方法b, b方法的返回值放在什麼地方
-
Heap:所有執行緒共享的堆空間,具體在GC的章節探討。
-
MethodArea:方法區,執行緒共享
-
存放每一個class的結構
-
方法區是邏輯上的概念,1.8前後有不同實現
1.8版本前指的是永久代,字元串常量位於PermSpace,FGC不會清理,大小啟動的時候指定,不能變。
1.8後指的是元數據區(Meta Space),字元串常量位於堆,會觸發FGC清理,不設定的話,就是最大的物理記憶體
-
方法區中包含RunTime Constant Pool,是class中的常量池中的數據運行時存放的地方
-
-
Native Method Stack:調用了C/C++本地方法的棧。
-
Direct Memory:JVM可以直接訪問的內核空間的記憶體(OS管理的記憶體),使用NIO,提高效率,實現零拷貝。
運行時數據中PC、JVM Stack、Native Method Stack是執行緒獨有的,而Heap、Method Area則是執行緒共享的。
-
JVM常用指令
如何查看指令的含義?idea中通過插件jclasslib直接點擊指令查看,或是查閱JVM規範。
-
store 存入LVT
-
load 從LVT取
-
pop彈棧
-
add 加法
-
mul乘法
-
sub減法
-
invoke
InvokeStatic調用靜態方法
InvokeVirtual調用可以多態的方法
InvokeInterface調用介面方法
InvokeSpecial調用可以直接定位,不需要多態的方法如private 方法、構造方法
InvokeDynamic調用lambda表達式或者反射或者其他動態語言scala kotlin,或者CGlib ASM,動態產生的類會用到的指令,JVM最難的指令
-
知識分享,轉載請註明出處。學無先後,達者為先!