Java多執行緒-程式執行堆疊分析

小碼農薛堯發表於2019-08-25

class檔案內容

class檔案包含JAVA程式執行的位元組碼;資料嚴格按照格式緊湊排列在class檔案中的二進位制流,中間無任何分隔符;檔案開頭有一個0xcafebabe(16進位制)特殊的一個標誌。

class檔案內容

JVM執行時資料區

jvm執行時資料區

執行緒獨佔:每個執行緒都會有它獨立的空間,隨執行緒生命週期而建立和銷燬 執行緒共享:所有執行緒能訪問這塊記憶體資料,隨虛擬機器或者GC而建立和銷燬

方法區

JVM用來儲存載入的類資訊、常量、靜態變數、編譯後的程式碼等資料。 虛擬機器規範中這是一個邏輯區劃。具體實現根據不同虛擬機器來實現。 如:oracle的HotSpot在java7中方法區放在永久代,java8放在後設資料空間,並且通過GC機制對這個區域進行管理

堆記憶體

Java多執行緒-程式執行堆疊分析

堆記憶體還可以細分為:老年代、新生代(Eden、From Survivor、To Survivor) JVM啟動時建立,存放物件的例項。垃圾回收器主要就是管理堆記憶體。 如果滿了,就會出現OutOfMemoryError。

虛擬機器棧

虛擬機器棧,每個執行緒都在這個空間有一個私有的空間。 執行緒棧由多個棧幀(Stack Frame)組成。 一個執行緒會執行一個或多個方法,一個方法對應一個棧幀。 棧幀內容包含:區域性變數表、運算元棧、動態連結、方法返回地址、附件資訊等。 棧記憶體預設最大是1M,超出則丟擲StackOverflowError

本地方法棧

和虛擬機器棧功能類似,虛擬機器棧是為虛擬機器執行JAVA方法而準備的,本地方法棧是為虛擬機器使用Native本地方法而準備。 虛擬機器規範沒有規定具體的實現,由不同的虛擬機器廠商去實現。 HotSpot虛擬機器中虛擬機器棧和本地方法棧的實現方式一樣的。同樣,超出大小以後也會丟擲StackOverflowError。

程式計數器

程式計數器(Program Counter Register)記錄當前執行緒執行位元組碼的位置,儲存的是位元組碼指令地址,如果執行Native方法,則計數器值為空。 每個執行緒都在這個空間有一個私有的空間,佔用記憶體空間很少。 CPU同一時間,只會執行一條執行緒中的指令。JVM多執行緒會輪流切換並分配CPU執行時間的方式。為了執行緒切換後,需要通過程式計數器,來恢復正確的執行位置。

相關文章