參見netty引用計數(shù)官方文檔:http://netty.io/wiki/reference-counted-objects.html
Netty中用虛引用檢測內(nèi)存泄漏的基本思路:
1)對于需要管理資源哄酝,創(chuàng)建一個虛引用(PhantomReference),并為其綁定一個引用隊列(ReferenceQueue);當(dāng)虛引用指向的對象被GC時劲赠,我們能夠在該引用隊列中獲取到對應(yīng)的虛引用(可以將其理解為一個GC通知)
2)Netty中對于池化(Pooled财著,即netty使用單獨的內(nèi)存池管理)的資源病线,會基于引用計數(shù)(ReferenceCounted)進(jìn)行單獨的管理危队;池化的資源使用完需要主動釋放以回收到內(nèi)存池中肴沫,也就是說宙枷,如果一個池化的資源使用正確掉房,那么在其被GC之前,資源肯定已經(jīng)被釋放慰丛,即其引用計數(shù)為0
3)為了檢測由于忘了釋放資源而導(dǎo)致的內(nèi)存泄漏(也即netty管理的內(nèi)存池的內(nèi)存泄漏)卓囚,netty會在池化的資源創(chuàng)建時按一定比例采樣,創(chuàng)建一個DefaultResourceLeak(netty自定義的一個虛引用的子類)并放入ResourceLeakDetector的引用隊列中诅病,并在適當(dāng)時刻檢測資源的釋放和GC情況
4)對于因GC而被放入到引用隊列中的DefaultResourceLeak哪亿,netty會檢測其是否已被關(guān)閉(即所指向的資源被手動回收了),如果沒有被釋放(對象已被gc但是內(nèi)存池中的內(nèi)存沒被釋放)贤笆,則有必要記錄一條內(nèi)存泄漏日志