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