一、JVM的整體流程
JVM在運作過程中會把它所管理的記憶體劃分成若幹不同的資料區域!
- 線程私有:程式計數器、虛拟機棧、本地方法棧
- 線程共享:堆、方法區
二、線程私有
-
程式計數器
指向目前線程正在執行的位元組碼指令的位址(行号),JVM裡面唯一不會發生OOM的區域。
java是多線程,為了記錄線程之間的切換。確定在多線程的情況下能正常執行。
-
本地方法棧
其實就是native方法調用了jni層。例如:Object.hashCode();該方法就是調用了native方法
-
虛拟機棧
每個線程私有的,線程在運作時,在執行每個方法的時候都會打包成一個棧幀,存儲了局部變量表,操作數棧,動态連結,方法出口等資訊,然後放入棧。每個時刻正在執行的目前方法就是虛拟機棧頂的棧桢。方法的執行就對應着棧幀在虛拟機棧中入棧和出棧的過程。
局部變量:其實就是存儲了方法裡的局部變量。
操作數棧:其實就是我們在方法方法裡面所操作的代碼,相當于是一個棧,操作的元素在棧裡一直運作入棧/出棧的操作。
動态連結:就是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之堆記憶體(年經代,老年代)