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