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