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。

file

  • 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則是執行緒共享的。

file

  • 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最難的指令

知識分享,轉載請註明出處。學無先後,達者為先!

Tags: