资源泄露
ByteBuf不再使用后(没有引用),没有调用release,导致ByteBuf资源一直被占用无法回收。
检测原理
原理:每次创建ByteBuf时,创建一个虚引用对象A指向该ByteBuf对象,如果正常调用release()操作,则虚引用对象A和ByteBuf对象均被回收;如果ByteBuf对象不再使用(没有其他引用)但没有调用release()操作,则GC时虚引用对象A被加入ReferenceQueue中,通过判断队列是否为空,即可知道是否存在内存泄露。
一、创建ByteBuf的逻辑:
protected ByteBuf newDirectBuffer(int initialCapacity, int maxCapacity) {
PoolThreadCache cache = threadCache.get();
PoolArena<ByteBuffer> directArena = cache.directArena;
final ByteBuf buf;
if (directArena !=