2015-03-03 2 views
1

У меня есть некоторые сомнения в отношении подсчета байтов в Netty 5 (или 4). Я обнаружил, что ничего не происходит, когда я не выпускаю bytebuf, когда он выходит из жизненного цикла, кажется, что память, используемая bytebuf, может быть GCed должным образом.Netty 4/5 фактически не обнаруживает утечку ресурсов bytebuf?

В этой ссылке http://netty.io/wiki/reference-counted-objects.html говорится, что установка опции JVM «-Dio.netty.leakDetectionLevel = advanced» или вызов ResourceLeakDetector.setLevel() может обнаруживать утечку ресурсов, но я не могу воспроизвести ее с помощью кода ниже.

public class App { 
    public static ByteBuf a(ByteBuf input) { 
     input.writeByte(42); 
     return input; 
    } 

    public static ByteBuf b(ByteBuf input) { 
     try { 
      ByteBuf output; 
      output = input.alloc().directBuffer(input.readableBytes() + 1); 
      output.writeBytes(input); 
      output.writeByte(42); 
      return output; 
     } finally { 
      // input.release(); 
     } 
    } 

    public static void c(ByteBuf input) { 
     //System.out.println(input); 
     // input.release(); 
    } 

    static class Task implements Runnable { 
     ByteBuf bbBuf; 

     public Task(ByteBuf buf) { 
      bbBuf = buf; 
     } 

     public void run() { 
      c(b(a(bbBuf))); 
     } 
    } 

    public static void main(String[] args) { 
     ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.PARANOID);  
     AbstractByteBufAllocator allocator = new PooledByteBufAllocator(); 

     ByteBuf buf = allocator.buffer(10, 100); 

     // buf.release(); 
     new Thread(new Task(buf)).start(); 
     System.out.println(buf.refCnt()); 
     assert buf.refCnt() == 0; 
    } 
} 

Так в чем проблема?

ответ

2

Механизм обнаружения утечки ресурсов в Netty опирается на ReferenceQueue и PhantomReference. Сборщик мусора не очень детерминирован, когда он уведомляет ReferenceQueue, когда объект (ByteBuf в нашем случае) становится недоступным. Если VM заканчивается слишком рано или мусор не собирается достаточно скоро, детектор утечки ресурсов не может определить, была ли утечка или нет, потому что сборщик мусора ничего нам не сказал.

Практически это не вызывает беспокойства, поскольку приложение Netty обычно работает в течение более длительного периода времени, и вы получите уведомление в конце концов. Просто запустите приложение около 30 секунд и дайте ему заняться работой. Вы обязательно должны увидеть сообщение об ошибке утечки.

+0

Благодарим вас за ответ. Я сомневаюсь, что могу ли я просто не выпускать bytebuf и полагаться только на gc для сбора памяти? Если я сделаю так, объединенный bytebuf просто потерял бы свое преимущество, и это не повлияет на неохлаждаемый bytebuf. –

Смежные вопросы