1、誰是真正的垃圾切心。判斷可觸及性
image.png
2、JAVA采用可達(dá)性分析
- 從GCRoots開始維護的有向圖片吊,進行搜索绽昏,如果一個對象沒有直接或間接指向GCROOTS的引用,就是垃圾俏脊。注意對象不能是“可復(fù)活的”全谤。
- GCRoots包括那些內(nèi)容:Class、Thread爷贫、JNI认然、Stack...
- 引用的強度补憾,及其差別,soft:內(nèi)存不足回收卷员,因此不會導(dǎo)致oom盈匾。weak:發(fā)現(xiàn)就回收。
image.png
image.png
3毕骡、GC算法
image.png
- 卡表(Card Table):為更快的回收新生代而生削饵,通過卡表,有選擇性的掃描老年代來發(fā)現(xiàn)引用未巫,根本原因:新生代回收頻繁窿撬,老年代頻率較低
image.png
四、如何晉升老年代
- 老年對象進入老年代:對象的年齡由對象經(jīng)歷的GC次數(shù)決定叙凡。默認(rèn)為15劈伴,當(dāng)然可以自己配置。
- 大對象進入老年代:一個大對象握爷,新生代的eden區(qū)或survior區(qū)都無法放的下跛璧,會直接晉升到老年代。
image.png
image.png
五新啼、TLAB(Thread Local Allocation Buffer):是一個線程專用的內(nèi)存分配區(qū)域赡模。為加速對象分配而生。
- 在多線程的情況下师抄,可能會同時有多個線程(競爭)進行內(nèi)存分配漓柑,因此需要保持同步,而同步又會導(dǎo)致效率下降叨吮。因此JVM使用TLAB來避免多線程沖突辆布,提高了對象的分配的效率。占用一段eden空間茶鉴。
- TLAB的啟用是否锋玲,對對象的分配的影響還是比較大的十偶。
六劫侧、JVM內(nèi)存分配策略:開啟棧上對象內(nèi)存分配。
image.png