程式計數器:存放當前線程接下來將要執行的位元組碼指令、分支、迴圈、跳轉、異常處理等信息。一個處理器只能執行一個線程中的指令,為了能夠在CPU時間片輪轉切換上下問之後順利回到正確的執行位置,每條線程都需要具有一個獨立的程式計數器,線程之間互不影響,JVM將此部分設計為線程私有的。虛擬機棧:也是線程私有的... ...
- 程式計數器:存放當前線程接下來將要執行的位元組碼指令、分支、迴圈、跳轉、異常處理等信息。一個處理器只能執行一個線程中的指令,為了能夠在CPU時間片輪轉切換上下問之後順利回到正確的執行位置,每條線程都需要具有一個獨立的程式計數器,線程之間互不影響,JVM將此部分設計為線程私有的。
- 虛擬機棧:也是線程私有的,它的生命周期與線程相同,是在JVM運行創建的。線上程中,方法在執行的時候會創建一個名為棧幀(stack frame)的數據結構,用於存儲局部變數表、操作棧、動態鏈接、方法出口等信息。方法的調用實際對應著虛擬機棧的壓棧和彈棧的過程。每一個線程創建之後都有創建一個對應的虛擬機棧,虛擬機棧的大小通過-xss來配置,相同的虛擬機棧大小若是局部變數表等占用的記憶體越小,則可以被壓入的棧幀就會越多也就是方法調用的深度,反之可被壓入的棧幀就會越少,一般將棧幀記憶體的大小成為寬度。而棧幀的數量則成為虛擬機棧的深度。該記憶體劃分的大小將決定一個JVM進程能夠創建多少個線程。 線程的創建數量是隨著虛擬機棧記憶體的增多而減少。
- 堆記憶體:用於存儲JVM的所有對象,該區域也是JVM垃圾回收重點照顧的對象。也稱為”GC堆“
方法區:多個線程共用此區域,存儲被虛擬機載入的類信息、常量、靜態變數、編譯後的代碼。
- 可以粗略的認為一個Java進程的記憶體大小為:堆記憶體+線程數量+棧記憶體
- 線程數量:(最大地址空間(MaxProcessMemory))-JVM記憶體-ReservedOsMemory)/ThreadStackSize(XSS)