参见netty引用计数官方文档:http://netty.io/wiki/reference-counted-objects.html
Netty中用虚引用检测内存泄漏的基本思路:
1)对于需要管理资源,创建一个虚引用(PhantomReference),并为其绑定一个引用队列(ReferenceQueue);当虚引用指向的对象被GC时,我们能够在该引用队列中获取到对应的虚引用(可以将其理解为一个GC通知)
2)Netty中对于池化(Pooled,即netty使用单独的内存池管理)的资源,会基于引用计数(ReferenceCounted)进行单独的管理;池化的资源使用完需要主动释放以回收到内存池中,也就是说,如果一个池化的资源使用正确,那么在其被GC之前,资源肯定已经被释放,即其引用计数为0
3)为了检测由于忘了释放资源而导致的内存泄漏(也即netty管理的内存池的内存泄漏),netty会在池化的资源创建时按一定比例采样,创建一个DefaultResourceLeak(netty自定义的一个虚引用的子类)并放入ResourceLeakDetector的引用队列中,并在适当时刻检测资源的释放和GC情况
4)对于因GC而被放入到引用队列中的DefaultResourceLeak,netty会检测其是否已被关闭(即所指向的资源被手动回收了),如果没有被释放(对象已被gc但是内存池中的内存没被释放),则有必要记录一条内存泄漏日志
网友评论