垃圾回收算法
JVM的垃圾回收算法并不是引用計(jì)數(shù)法牌废,而是可達(dá)性分析算法
可達(dá)性分析算法: 在判斷一個(gè)對(duì)象是否可以被GC的時(shí)候必搞,JVM通過(guò)深度優(yōu)先搜索判斷當(dāng)前對(duì)象的應(yīng)用是否可以到達(dá)GC ROOT,如果沒(méi)有,則下一次GC時(shí)庵楷,這個(gè)對(duì)象會(huì)被回收
-
在Java 中GC ROOT可能的類(lèi)型包括
- 虛擬機(jī)棧的引用
- 方法去中類(lèi)靜態(tài)屬性的引用
- 方法區(qū)中常量的引用
- 本地方法棧中JNI的引用
-
四種引用類(lèi)型
- 強(qiáng)引用(default):即使OOM也不會(huì)被回收
- 軟引用: OOM前會(huì)被回收
- 弱引用: 在下一次GC時(shí)百姓,會(huì)被回收
- 虛引用: 為一個(gè)對(duì)象設(shè)置虛幻引用的唯一作用是臀玄,這個(gè)對(duì)象在被回收時(shí)瓢阴,收到一個(gè)系統(tǒng)通知
方法區(qū)中對(duì)象的回收
- 常量池中的對(duì)象,例如一個(gè)字符串“abc”健无,如果一個(gè)沒(méi)有String對(duì)象引用它荣恐,也沒(méi)有其他地方引用,如果有必要的話(huà),這個(gè)字符串會(huì)被回收掉
- 對(duì)于類(lèi)的回收叠穆,需要滿(mǎn)足三個(gè)條件
- 該類(lèi)的所有實(shí)例已經(jīng)被回收
- 加載該類(lèi)的所有classloader已經(jīng)被回收
- 該類(lèi)對(duì)應(yīng)的java.lang.Class對(duì)象沒(méi)有在任何地方被引用少漆,無(wú)法在任何地方通過(guò)反射訪問(wèn)該類(lèi)的方法
在大量使用反射,動(dòng)態(tài)代理硼被,CGLIB等ByteCode框架的以及OSGI的示损,需要在方法區(qū)進(jìn)行垃圾回收
垃圾回收算法
標(biāo)記-清除
- 效率問(wèn)題
- 標(biāo)記清楚以后會(huì)產(chǎn)生大量的不連續(xù)的內(nèi)存碎片
復(fù)制算法
它將內(nèi)存空間分為兩部分,每次只使用其中的一部分嚷硫,這部分內(nèi)存使用完了以后检访,將還存活的對(duì)象復(fù)制到另一塊內(nèi)存模塊上
- 非常適用于新生代的GC算法
- 具體實(shí)現(xiàn): 一塊Eden區(qū),兩塊survivor區(qū)
標(biāo)記-整理算法
類(lèi)似標(biāo)記-清除算法仔掸,先是對(duì)可回收的對(duì)象進(jìn)行標(biāo)記脆贵,然后這些對(duì)象的內(nèi)存向一邊進(jìn)行移動(dòng),然后后整塊清除
- 此回收算法適用于老年代
垃圾回收器
- 目前所有的新生代gc都是需要STW的(Stop the world)
- Serial:?jiǎn)尉€程STW起暮,復(fù)制算法
- ParNew:多線程并行STW卖氨,復(fù)制算法
- Parallel Scavange:多線程并行STW,吞吐量?jī)?yōu)先负懦,復(fù)制算法
- G1:多線程并發(fā)筒捺,可以精確控制STW時(shí)間,整理算法
- 對(duì)象優(yōu)先在Eden區(qū)分配存儲(chǔ)空間密似,當(dāng)Eden區(qū)內(nèi)存不足時(shí)焙矛,將會(huì)發(fā)起一場(chǎng)Minor GC
- 大對(duì)象直接進(jìn)入老年代 : 盡量少產(chǎn)生一些短命的大對(duì)象
- 長(zhǎng)期存活的對(duì)象直接進(jìn)入老年代