- 什么是垃圾回收纷宇?
- 垃圾回收的是什么?
- 如何判斷為垃圾拓春?
- 垃圾是怎樣被回收的?
- 垃圾回收哪些區(qū)域的內(nèi)存?
什么是垃圾回收
垃圾回收就是將被虛擬機(jī)視為垃圾的對象所占的內(nèi)存釋放掉。
垃圾回收的是什么
回收的是對象所占的內(nèi)存
如何判斷為垃圾
在垃圾收集器對堆內(nèi)存進(jìn)行回收前殴穴,會先判斷哪些對象還在“存活”震桶,哪些對象已經(jīng)“死去”磨取,這些“死去”的對象,就是我們需要進(jìn)行回收的垃圾。一般判定為垃圾有兩種算法甥雕。
-
引用計(jì)數(shù)算法(已淘汰)
引用計(jì)數(shù)算法,是指給對象中添加一個引用計(jì)數(shù)器,每當(dāng)有一個地方引用它時,計(jì)數(shù)器的值就加1挨务,當(dāng)引用失效時惯雳,計(jì)數(shù)器的值就減1。當(dāng)計(jì)數(shù)器值為0時揪荣,該對象就會被回收。
- 優(yōu)點(diǎn):簡單直接挨决,效率高陌粹。
- 缺點(diǎn):對于對象之間的相互引用無法解決蒙幻,導(dǎo)致內(nèi)存的泄露诈豌。
-
可達(dá)性分析算法
通過一系列被稱為“GC Roots”的對象作為起點(diǎn)庙洼,然后向下搜索,所走過的路徑被稱為引用鏈。當(dāng)一個對象到 GC Roots之間沒有任何引用鏈時,則說明該對象是不可用的,虛擬機(jī)就會將它們的內(nèi)存釋放掉。
GC Roots有哪些
- 虛擬機(jī)棧中引用的對象。
- 方法區(qū)中類靜態(tài)屬性引用的對象熟妓。
- 方法區(qū)中常量引用的對象抬虽。
- 本地方法棧中引用的對象笛辟。
垃圾是怎樣被回收的
通過垃圾回收算法疑故,JVM對垃圾進(jìn)行標(biāo)定然后回收其占用的內(nèi)存空間纵势。常見的垃圾回收算法有三種:
- 復(fù)制算法
- 優(yōu)點(diǎn):簡單高效钦铁,不會出現(xiàn)內(nèi)存碎片問題
- 缺點(diǎn):內(nèi)存利用率低牛曹,只有一半黎比。如果存活對象很多的時候不跟,效率低购城,因?yàn)樾枰獜?fù)制很多對象。
- 標(biāo)記清除
- 優(yōu)點(diǎn):利用率百分之百
- 缺點(diǎn):標(biāo)記和清除的效率不高,會產(chǎn)生內(nèi)存碎片
- 標(biāo)記整理
- 優(yōu)點(diǎn):利用率百分之百,沒有內(nèi)存碎片
- 缺點(diǎn):效率很低,因?yàn)樾枰矂觾?nèi)存
不同內(nèi)存區(qū)域采用的回收算法不同帖蔓,新生代使用復(fù)制算法矮瘟。因?yàn)榻^大多數(shù)對象不需要回收。老年代一般采用標(biāo)記整理算法塑娇,CMS垃圾回收器采用標(biāo)記清除算法澈侠。
垃圾回收哪些區(qū)域的內(nèi)存
我們常談的回收,絕大多數(shù)是回收堆內(nèi)存埋酬。