天天看點

深入了解JVM之記憶體結構(棧,堆劃分)

一、JVM的整體流程

深入了解JVM之記憶體結構(棧,堆劃分)

JVM在運作過程中會把它所管理的記憶體劃分成若幹不同的資料區域!

  1. 線程私有:程式計數器、虛拟機棧、本地方法棧
  2. 線程共享:堆、方法區
    深入了解JVM之記憶體結構(棧,堆劃分)

二、線程私有

  1. 程式計數器

    指向目前線程正在執行的位元組碼指令的位址(行号),JVM裡面唯一不會發生OOM的區域。

    java是多線程,為了記錄線程之間的切換。確定在多線程的情況下能正常執行。

  2. 本地方法棧

    其實就是native方法調用了jni層。例如:Object.hashCode();該方法就是調用了native方法

  3. 虛拟機棧

    每個線程私有的,線程在運作時,在執行每個方法的時候都會打包成一個棧幀,存儲了局部變量表,操作數棧,動态連結,方法出口等資訊,然後放入棧。每個時刻正在執行的目前方法就是虛拟機棧頂的棧桢。方法的執行就對應着棧幀在虛拟機棧中入棧和出棧的過程。

    局部變量:其實就是存儲了方法裡的局部變量。

    操作數棧:其實就是我們在方法方法裡面所操作的代碼,相當于是一個棧,操作的元素在棧裡一直運作入棧/出棧的操作。

    動态連結:就是java的多态

    方法出口(傳回位址):結果傳回

例子:

public class JavaStack {
    public void king(int money){
        money = money -100; 
     }
    public static void main(String[] args)throws Throwable {
        JavaStack javaStack = new JavaStack();
        javaStack.king(10000);
    }
}
           

在指令行裡面輸入:javap -c -v JavaStack.clss > a.txt

重定向輸出一個反編譯的檔案,這個檔案其實就是king方法裡面的一個虛拟機棧的操作流程

public void king(int);
    descriptor: (I)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: iload_1
         1: bipush        100
         3: isub
         4: istore_1
         5: return
      LineNumberTable:
        line 11: 0
        line 12: 5
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0  this   Lcom/jvm/ch01/JavaStack;
            0       6     1 money   I
           

我這邊通過圖來分析:

深入了解JVM之記憶體結構(棧,堆劃分)

這一節隻介紹線程私有的,下一節在仔細分析線程共享,深入了解JVM之堆記憶體(年經代,老年代)

繼續閱讀