內(nèi)存分配和回收

GC主要回收區(qū)域:JVM 堆

1、堆的區(qū)域劃分

新生代、老年代? 占用內(nèi)存比例1:2

新生代

eden、from survivor、to survivor? 占用內(nèi)存比例8:1:1

-Xmn 設(shè)置新生代大小

-XX:survivorRatio=8 設(shè)置eden和survivor區(qū)的比例8:2。survivor分為from survivor和to survivor,并且比例是1:1,所以eden:from survivor:to survivor 的內(nèi)存占比是 8:1:1

2、GC判斷對象的存活

通過可達性分析算法分析對象是否存活。從GC roots的對象作為起點,從這些節(jié)點向下搜索,當一個對象到GC roots沒有引用鏈連接時,說明該對象是不可用的,可以被回收。

GC Root的對象包括:

*靜態(tài)屬性引用的對象

*常量引用的對象

*虛擬機棧(棧幀中的本地變量表)中引用的對象

*本地方法棧中引用的對象

3、對象的引用

強引用

new 方式應(yīng)用的對象,都是強引用

軟引用(SoftReference)

內(nèi)存空間足夠時,GC不會回收軟引用的對象;內(nèi)存空間不足時,GC會回收軟引用的對象。

展示圖片使用內(nèi)存,可以使用軟引用,內(nèi)存不足時,GC會回收對象引用

弱引用(WeakReference)

無論內(nèi)存空間是否充足,只要GC就會被回收

ThreadLocal中使用弱引用

虛引用(PhantomReference)


4、垃圾回收算法

復(fù)制回收算法:

內(nèi)存利用率低,只有50%

在新生代使用復(fù)制回收算法

默認情況下新生代的內(nèi)存劃分比例:一般內(nèi)存中90%的對象不需要回收,10%的對象需要回收。由于新生代使用復(fù)制回收算法,內(nèi)存利用率只有10%,所以新生代的20%作為復(fù)制算法的預(yù)留區(qū)域,即survivor區(qū)。eden:from survivor:to survivor=8:1:1

標記-清除算法

內(nèi)存利用率100%,不需要內(nèi)存復(fù)制,但是又有內(nèi)存碎片

標記-整理算法

利用率100%,需要內(nèi)存復(fù)制,不會有內(nèi)存碎片

5、JVM內(nèi)存分配原則

*對象優(yōu)先放入eden區(qū),eden區(qū)存放不下的大對象,直接進入老年區(qū)

*長期存活的對象進入老年區(qū),一次GC,對象的對象頭中存放的對象年齡+1,年齡達到15時,進入老年去

*動態(tài)對象年齡判斷,一次GC后,需要存入from/to survivor區(qū)的對象超出分配的內(nèi)存,from/to survivor區(qū)的對象全部進入老年區(qū)

*空間擔保策略(老年區(qū))

6、收集器

有單線程收集器和并行多線程收集器

G1

CMS

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容