Java垃圾回收机制(GC)
生活随笔
收集整理的這篇文章主要介紹了
Java垃圾回收机制(GC)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
GC原理
對于GC來說,當(dāng)程序員創(chuàng)建對象時(shí),GC就開始監(jiān)控這個(gè)對象的地址、大小以及使用情況。
通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達(dá)的",哪些對象是"不可達(dá)的"。當(dāng)GC確定一些對象為"不可達(dá)"時(shí),GC就有責(zé)任回收這些內(nèi)存空間。
優(yōu)點(diǎn):
- 垃圾回收機(jī)制有效的防止了內(nèi)存泄露,可以有效的使用可使用的內(nèi)存。
- 垃圾回收器通常作為一個(gè)單獨(dú)的低級別的線程運(yùn)行,在不可預(yù)知的情況下對內(nèi)存堆中已經(jīng)死亡的或很長時(shí)間沒有用過的對象進(jìn)行清除和回收。
- 程序員不能實(shí)時(shí)的對某個(gè)對象或所有對象調(diào)用垃圾回收器進(jìn)行垃圾回收。
如何判斷哪些對象可以被GC回收
- 引用計(jì)數(shù)器法:為每個(gè)對象創(chuàng)建一個(gè)引用計(jì)數(shù),有對象引用時(shí)計(jì)數(shù)器 +1,引用被釋放時(shí)計(jì)數(shù) -1,當(dāng)計(jì)數(shù)器為 0時(shí)就可以被回收。它有一個(gè)缺點(diǎn)不能解決循環(huán)引用的問題;
- 可達(dá)性分析算法:從 GC Roots 開始向下搜索,搜索所走過的路徑稱為引用鏈。當(dāng)一個(gè)對象到 GC Roots 沒有任何引用鏈相連時(shí),則證明此對象是可以被回收的。
注意:
垃圾回收不會(huì)發(fā)生在永久代,如果永久代滿了或者是超過了臨界值,會(huì)觸發(fā)完全垃圾回收(Full GC)。如果你仔細(xì)查看垃圾收集器的輸出信息,就會(huì)發(fā)現(xiàn)永久代也是被回收的。這就是為什么正確的永久代大小對避免Full GC是非常重要的原因。
java引用分析
- 強(qiáng)引用:發(fā)生 gc 的時(shí)候不會(huì)被回收。
- 軟引用:有用但并不是必需的對象,在對于軟引用關(guān)聯(lián)著的對象,只有在內(nèi)存不足的時(shí)候JVM才會(huì)回收該對象。
軟引用可以和一個(gè)引用隊(duì)列聯(lián)合使用,如果軟引用所引用的對象被JVM回收,這個(gè)軟引用就會(huì)被加入到與之關(guān)聯(lián)的引用隊(duì)列中
- 弱引用:非必需對象的,當(dāng)JVM進(jìn)行垃圾回收時(shí),無論內(nèi)存是否充足,都會(huì)回收被弱引用關(guān)聯(lián)的對象
- 虛引用(幽靈引用/幻影引用):無法通過虛引用獲得對象,用 PhantomReference 實(shí)現(xiàn)虛引用,虛引用的用途是在 gc時(shí)返回一個(gè)通知。
參考資料:
https://blog.csdn.net/jiahao1186/article/details/81591861
總結(jié)
以上是生活随笔為你收集整理的Java垃圾回收机制(GC)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 随机排列_“按字母顺序排列”其实是种随机
- 下一篇: Java实现PDF生成(Word文档转P