class檔案內容
class檔案包含JAVA程式執行的位元組碼;資料嚴格按照格式緊湊排列在class檔案中的二進位制流,中間無任何分隔符;檔案開頭有一個0xcafebabe(16進位制)特殊的一個標誌。
JVM執行時資料區
執行緒獨佔:每個執行緒都會有它獨立的空間,隨執行緒生命週期而建立和銷燬 執行緒共享:所有執行緒能訪問這塊記憶體資料,隨虛擬機器或者GC而建立和銷燬
方法區
JVM用來儲存載入的類資訊、常量、靜態變數、編譯後的程式碼等資料。 虛擬機器規範中這是一個邏輯區劃。具體實現根據不同虛擬機器來實現。 如:oracle的HotSpot在java7中方法區放在永久代,java8放在後設資料空間,並且通過GC機制對這個區域進行管理
堆記憶體
堆記憶體還可以細分為:老年代、新生代(Eden、From Survivor、To Survivor) JVM啟動時建立,存放物件的例項。垃圾回收器主要就是管理堆記憶體。 如果滿了,就會出現OutOfMemoryError。
虛擬機器棧
虛擬機器棧,每個執行緒都在這個空間有一個私有的空間。 執行緒棧由多個棧幀(Stack Frame)組成。 一個執行緒會執行一個或多個方法,一個方法對應一個棧幀。 棧幀內容包含:區域性變數表、運算元棧、動態連結、方法返回地址、附件資訊等。 棧記憶體預設最大是1M,超出則丟擲StackOverflowError
本地方法棧
和虛擬機器棧功能類似,虛擬機器棧是為虛擬機器執行JAVA方法而準備的,本地方法棧是為虛擬機器使用Native本地方法而準備。 虛擬機器規範沒有規定具體的實現,由不同的虛擬機器廠商去實現。 HotSpot虛擬機器中虛擬機器棧和本地方法棧的實現方式一樣的。同樣,超出大小以後也會丟擲StackOverflowError。
程式計數器
程式計數器(Program Counter Register)記錄當前執行緒執行位元組碼的位置,儲存的是位元組碼指令地址,如果執行Native方法,則計數器值為空。 每個執行緒都在這個空間有一個私有的空間,佔用記憶體空間很少。 CPU同一時間,只會執行一條執行緒中的指令。JVM多執行緒會輪流切換並分配CPU執行時間的方式。為了執行緒切換後,需要通過程式計數器,來恢復正確的執行位置。