「每日五分鐘,玩轉JVM」:執行緒獨佔區
前言
如果我們對計算機組成有所瞭解,那麼我們一定會知道在計算機中有一塊兒特殊的區域,稱之為暫存器,暫存器包括了指令暫存器和程式計數器,這兩樣位於CPU中,作為程式執行的大腦來控制程式的執行和流轉。
而在JVM中,作為一種虛擬機器,JVM沒有指令暫存器,它是基於棧 + 程式計數器的體系結構來完成方法的執行,之所以這麼去設計一方面是為了指令集的緊湊,一方面是有些平臺上的暫存器很少或者根本沒有,而且以處理器架構的角度來說,設計一套通用的暫存器指令是很困難的,而且還有一方面的考量就是有助於執行時某些虛擬機器實現的動態編譯器和即時編譯器的程式碼優化。
程式計數器
我們在使用IDE寫程式碼的時候,旁邊經常會有行數,方便我們去閱讀我們自己的程式碼,去定位我們程式碼的位置,而程式計數器是給JVM執行位元組碼過程中看的行號指示器,只不過他其中存的並非是行號,而是執行中虛擬機器位元組碼指令的地址,也正是因為計數器中儲存的僅僅是一條執行中的指令地址,使用的記憶體是及其有限的,所以這個區域是唯一一個沒有OOM的區域。位元組碼直譯器通過改變程式計數器中的地址來尋找對應的指令來完成對程式的控制(這裡具體我們會在分析指令集時去詳細的深入瞭解,這裡僅僅點到為止)
這裡需要注意一點,如果是本地Native 方法,該計數器的值是Undefined,其實也很好理解,人家壓根不屬於JVM去管理,你憑什麼去記錄。。這裡我們使用的可以說是Native方法提供出的一個介面,具體的實現是通過C來完成的。
上節課我們說到多執行緒的實現是基於時分複用來實現的,為了每個執行緒的執行的互不干擾和有序性,程式計數器必須保證在切換時能夠回到正確的位置,所以它必須也必然是執行緒獨佔區的一份子。
關鍵字:
- 行號指示器
- 執行中位元組碼指令地址
- 沒有OOM
- Native方法不歸他管
- 執行緒獨享
棧
虛擬機器棧
虛擬機器棧是Java方法執行時的記憶體模型,包括了局部變量表,運算元棧,動態連線,方法返回地址以及一些附加資訊,每個方法在被執行的時候會在虛擬機器棧中創造一個棧幀。
棧幀在執行的時候建立壓入棧,在完全執行完成後就會進行彈棧,下面是一個小