Java GC(garbage collec,垃圾收集,回收)
GC是對(duì)JVM中的內(nèi)存進(jìn)行標(biāo)記和回收,Sun公司的JDK用的虛擬機(jī)都是HotSpot,對(duì)象化的實(shí)例是放在heap堆內(nèi)存中的,這里講的分代收集也是指對(duì)堆內(nèi)存的回收。
GC的分代收集分為:年輕代、老年代、永久代。(方法區(qū)是被當(dāng)做永久代的,不過JDK1.6后將被取消掉了)
年輕代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法區(qū))
1.年輕代的GC(存放實(shí)例化的對(duì)象)
年輕代分為三個(gè)區(qū):Eden和兩個(gè)存活區(qū)(Survivor0和Survivor1),分別占內(nèi)存的80%、10%、10%
使用“停止-復(fù)制(Stop-and-copy)”清理法(將Eden區(qū)和一個(gè)Survivor中仍然存活的對(duì)象拷貝到另一個(gè)Survivor中)
當(dāng)Eden區(qū)滿時(shí),就執(zhí)行一次MinorGC,并將剩余存活的對(duì)象都添加到Surivivor0,回收Eden中的沒有存活的對(duì)象。
當(dāng)Surivivor0頁都滿了的時(shí)候,就將仍然存活的存到Surivivor1中,回收Surivivor0中的對(duì)象
Surivivor0和Surivivor1依次去存,當(dāng)兩個(gè)存活區(qū)切換了幾次后(HotSpot默認(rèn)是15次),將仍然存活的對(duì)象復(fù)制到老年代。
2.老年代的GC(存放較大的實(shí)例化的對(duì)象和在年輕代中存活了足夠久的對(duì)象)
老年代GC用的是標(biāo)記-整理算法,即標(biāo)記存活的對(duì)象,向一端移動(dòng),保證內(nèi)存的完整性,然后將未標(biāo)記的清掉。
當(dāng)老年代不夠用時(shí),也會(huì)執(zhí)行Major GC,即Full GC。
注意:如果永久代代存放的常量和類過大,無法全部放入永久代,也會(huì)觸發(fā)永久代的GC,將一部分放入老年代。
3.永久代的GC(存放常量、類)
說明:在JDK1.6版本之后,永久代就要被取消掉了,只留下年輕代和老年代。
說明:年輕代的GC是必須的,但是老年代和永久代并不是必須的,可以通過設(shè)置參數(shù)來決定是否對(duì)類進(jìn)行回收。
下面是畫的一個(gè)大概的圖片:
