內存模型
線程棧:每個線程創建自己的棧區,大小可配置。如果太小遞歸調用會stackOverflow
堆內存:存儲對象的區域,最大最小值均可設置
方法區:常量,類信息,靜態變量等,大小可配置
程序計數器:不會有內存溢出,記錄程序執行行數等
本地方法棧:會內存溢出。
image.png
GC-堆內存
Eden :新創建對象都在伊甸區
S0:新生代復制區域,默認是Eden的八分之一大小
S1:新生代復制區域,S0和S1兩個區域完成不斷復制的過程。
Old:老年代,新生代無法回收,大對象都會進入老年代。
GC-永久代
指方法區的內存回收。主要回收兩部分內容:廢棄常量和無用的類。頻率遠低于堆內存。
垃圾回收算法
- 可達性算法,GC Roots往下搜索。GC Roots可以是虛擬機棧(棧幀中的本地變量表)中引用的對象等。
- 復制算法。新生代的算法。兩塊區域,將存活的復制到新區域,老區域清空。
- 標記清除算法。第一輪標記廢棄對象,第二輪刪除他們。
- 標記整理算法。與標記清除類似,但是刪除之后,存活的對象向前移動,避免空間碎片。
- 新生代都是復制算法,空間不夠由老年代來擔保。
- 老年代都是標記整理,多線程的。