什么樣的物件可以稱為垃圾物件?換句話說:在垃圾收集器作業的時候,那些物件是可以被回收的,哪些物件是不可以被回收的?判斷的標準是什么?系統中的物件千千萬,怎么才能準確無誤的找出來并“殺”掉就顯得尤為重要,
2、你才是垃圾
為了解決上面的問題,JVM 專門設計一套判斷物件是的是垃圾的演算法——可達性分析,
可達性分析的原理是:根據每一個物件,一層一層的參考往上找,說白了就是看看那些地方在參考著這個物件,直到找到能被稱之為GC Roots的物件在參考這個這個物件,那么這個時候 JVM 就認為這個物件是不是垃圾物件,也就是在垃圾回收的時候是不會去回收這部分物件的,反之,這樣的物件就可以被稱為垃圾物件,也就意味著是會被在垃圾收集器作業的時候就會回收這部分物件,
3、GC Roots
說到這里,哪些是垃圾物件我們是可以判斷了,那么剛剛提到的 GC Roots 又是什么鬼?簡單的來講,靜態變數、區域變數、常量、本地方法堆疊中的物件,但是一般最常見的就是,靜態變數、區域變數,
我們姑且先這個記住,也就是凡是被這些物件參考的物件,就是不能被回收的,換言之,系統是在某些地方還在使用這些物件,這些物件我們也稱之為強參考,對應的還有軟參考,弱參考和虛參考,
# 強參考(使用頻率:☆☆☆☆☆)
我們平時開發時候通過 new 關鍵創建出來的物件就是強參考,這類物件在垃圾回收的時候只要是能找到 G CRoots,那么他們是不會被回收的,
# 軟參考(使用頻率:☆☆☆☆)
所謂軟參考,就是表示該物件在垃圾回收期間,不軟是否被其他物件參考,只要是記憶體空間不夠了,那么該物件就會別垃圾收集器回收,
(PS:這個也是大家很容易和弱參考搞混淆的一個術語,我相信你平時開發常用的一定是 SoftReference ,而很少使用 WeakReference ,也就是說,強參考下面的一個就是軟參考,希望能幫助大家理解這兩個之間的區別,)
# 弱參考(使用頻率:☆)
這類參考存在的價值更容易被忽視,只要是在垃圾回收階段,不管記憶體是否足夠,該型別的物件都會被垃圾收集器回收,
# 虛參考(使用頻率:程式員基本不會使用到)
“虛參考”顧名思義,就是形同虛設,與其他幾種參考都不同,虛參考并不會決定物件的生命周期,如果一個物件僅持有虛參考,那么它就和沒有任何參考一樣,在任何時候都可能被垃圾回收,虛參考主要用來跟蹤物件被垃圾回收的活動,虛參考與軟參考和弱參考的一個區別在于:虛參考必須和參考佇列(ReferenceQueue)聯合使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/281004.html
標籤:AI
