JVM的内存分区
JVM的內存分區
這篇文章嘗試討論清楚JVM的內存分區情況。
1.?????? JVM的內存和系統內存的關系
下圖是對系統內存及JVM內存的大致描繪
?
對大多數操作系統,內存可以分為物理內存RAM及Swap(交換區)兩大部分,Swap Space在物理上是一塊獨立的磁盤區域,當操作系統發現內存不夠使用時,便開始使用交換區。
在系統層面,Linux系統的內存大致可以劃分為:
一個JAVA程序開始運行之后,是存在于系統之上的一個進程。這個進程所占用的內存由JVM管理。
2.?????? JVM內存的劃分
JVM的內存可以劃分為以下幾個主要部分:
?
堆是內存回收的主戰場,因此由稱為Garbage Collected Heap(GC堆),在分代收集策略下,堆可以進一步劃分為新生代和老年代,更細致的:
- Eden區,對象第一次創建時,從Eden區開辟空間
- Survivor區,當Eden區不足以進行下次內存分配時,JVM觸發一次GC,經過GC但未被回收的對象,被轉移到Survivor區。Survivor分為From,To兩部分,多次內存回收時未被回收的對象在這兩塊區域中來回轉移。
- Old區,當經過一定次數的GC后仍未被回收的對象,JVM將其轉移到老年代區
4. JVM Stack,JAVA虛擬機棧,線程私有,其生命周期與對應的線程相同。當每個方法執行時,均會創建一個棧幀(Stack Frame)用于存儲局部變量表,操作數棧,動態鏈接,方法出口等信息。每個方法的執行和完成,便對應著Stack Frame在虛擬機棧中的出棧和入棧的過程。通常意義上粗糙地將JVM內存劃分為堆和棧,其中的棧便指的是JVM Stack.
5. Native Method Stack,本地方法棧,與JVM Stack類似,本地方法棧對應的是Native方法的執行管理。
此外,程序運行所需要的內存開辟在JVM的內存空間中,也可以直接申請系統內存(Directive Memory),但是直接申請的系統內存不受JVM的垃圾回收管理,其釋放由系統層面控制,因此對于不關注內存回收的JAVA程序員來說,容易導致內存溢出等問題的發生。
轉載于:https://www.cnblogs.com/luojiahu/p/8231502.html
總結
- 上一篇: U盘容量减少的解决办法
- 下一篇: nginx模块_使用gdb调试nginx