內(nèi)存垃圾回收主要是解決3個(gè)問(wèn)題
- 哪些內(nèi)存需要回收 what
- 何時(shí)回收 when
- 怎么回收 how
哪些需要回收
程序計(jì)數(shù)器、方法棧、本地方法棧,這三個(gè)區(qū)域隨著線程而生,隨線程而滅
- 引用計(jì)數(shù)法 :
優(yōu)點(diǎn); 實(shí)現(xiàn)簡(jiǎn)單,效率高
缺點(diǎn):無(wú)法判斷環(huán)式引用 - 可達(dá)性分析:通過(guò)一系列稱之為GC Roots的對(duì)象作為起始點(diǎn),從這些節(jié)點(diǎn)開始向下搜索,所走過(guò)的路徑稱之為引用鏈。當(dāng)一個(gè)對(duì)象到任何一個(gè)GC roots 不存在引用鏈相連的時(shí)候,則證明此對(duì)象是不可達(dá)的。java中GC Roots包含以下幾種:
- 虛擬機(jī)棧中引用的對(duì)象
- 方法區(qū)中類靜態(tài)屬性引用的對(duì)象
- 方法區(qū)中常量引用的對(duì)象
- 本地方法棧中引用的對(duì)象
何時(shí)回收
java中引用有如下幾種
- 強(qiáng)引用
最普遍的存在 a=new A - 軟引用
用來(lái)保存有用但非必須(例如cache)系統(tǒng)將要在發(fā)生內(nèi)存溢出之前,將會(huì)把這些對(duì)象列進(jìn)回收范圍之內(nèi)進(jìn)行第二次回收 - 弱引用
也是用來(lái)描述非必須對(duì)象的,但是它的強(qiáng)度比軟引用更弱一些,被弱引用關(guān)聯(lián)的對(duì)象只能生存到下一次垃圾回收之前,當(dāng)垃圾回收的時(shí)候,無(wú)論內(nèi)存是否足夠,都會(huì)回收掉只被弱引用關(guān)聯(lián)的對(duì)象(使用場(chǎng)合?) - 虛引用
虛引用的存在不會(huì)對(duì)生存周期產(chǎn)生任何影響,也無(wú)法通過(guò)弱引用取得一個(gè)對(duì)象的實(shí)例,為一個(gè)對(duì)象設(shè)置虛引用的唯一目的就是能在這個(gè)對(duì)象被回收之前收到一個(gè)系統(tǒng)通知