目錄
美圖說個**,先上圖:
如上圖所示嘛:
首先嘛JVM內存區分爲堆heap(上圖白色區域)、非堆non-heap(上圖藍色區域)。
堆和非堆。簡單來說堆就是Java代碼可及的內存,是留給開發人員使用的;非堆就是JVM留給 自己用的,
-
一:non-heap
- 非堆中的方法區 Method Area (也稱永久帶)是用來存放類信息、常量、靜態變量的。這個內存區可以用上圖中橘黃色的參數進行配置;方法區中有一個常量池:用於存放各種符號引用;
- 虛擬機棧用於存放局部變量表(基本數據類型、對象引用等)、操作棧、方法出口;
- 本地方法棧與虛擬機棧基本類似,區別在於虛擬機棧爲虛擬機執行的java方法服務,而本地方法棧則是爲Native方法服務;
-
程序計數器用來記錄程序下一條指令。
-
二:heap
1:堆內存用來存放對象實例和數組(所有new對象),這裏可以通過上面的橘黃色的參數配置大小;
2:堆內存分爲兩部分:
a:年輕代Young;年輕代是用來存放剛創建的對象,可以使用上圖中的橘黃色參數配置大小;
b:老年代Old;老年代是用來存放大對象或者已經存活了很久的對象;
3:其中年輕代又分爲三部分:
a:Eden;
b:From Survivor;
c:To Survivor;
主要使用複製清除算法,在Eden內存塊和其中一個Survivor把需要保存的數據移到另一個Survivor,下次繼續反覆,直到15次之後便更新到老年代中,執行一次GC,命名爲 Minor GC。其中老年代稱爲Full GC。
參考鏈接:Java虛擬機的內存組成以及堆內存介紹
Xms Xmx PermSize MaxPermSize 區別