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