這部分內容雖然是JVM中的定義,但是在juc中屬于底層知識,必須要學習
每個線程在創建時,就會將自身的資源存儲在棧中,將線程需要運行的方法存放在方法區。
棧中會存儲方法的局部變量、方法的參數以及方法返回的地址,這部分在線程創建的初始化時就會被創建。
棧幀對應線程執行的方法,每執行一個方法就會創建一個棧幀,這個棧幀維護當前方法的對應局部變量、方法參數以及返回地址。
程序計數器用于記錄當前執行到的程序,用于上下文切換。比如當前程序計數器為1,指向線程1,此時線程1CPU時間輪片耗盡,jvm會保存當前線程的運行環境,也就是棧幀里的數據內容,然后轉向執行下一個線程,將程序計數器置為下個線程對應的值,然后就會去執行線程2,最后當CPU調度到線程1時,會根據棧幀的內容回復當前線程運行環境并繼續執行當前線程。
注意:
JVM 中的“程序計數器”(PC 寄存器)記錄的是什么
-
它不是線程 ID,也不是業務邏輯中的“程序編號”。
-
在 JVM 規范里,每個 Java 線程都有自己的一塊 PC 寄存器,用來存放當前正在執行的字節碼指令地址(即下一條要執行的指令的偏移量)。
-
舉例來說,如果你在執行第 50 條
iload_1
,PC 寄存器可能保存的是 50;執行完后它自動增到 51,準備執行下一條指令。
保存的環境”具體包括:
-
Java 棧(Stack Frames):局部變量表、操作數棧、動態鏈接、返回地址
-
PC 寄存器的值:字節碼的偏移量