簡體   English   中英

如何破壞SelectionKey附件? attach(null)不起作用

[英]How destroy SelectionKey attachment? attach(null) doesn't work

我的java應用程序有內存泄漏 - 當我的資源清除代碼正在執行時,任務管理器顯示內存使用情況沒有改變。 我的代碼

while (isRunning) {
      try 
      {

             selector.select(); 

             long sum=0;

             Set keys =  selector.selectedKeys();
             Iterator it = keys.iterator(); 
             while(it.hasNext())
             {
                 SelectionKey key = (SelectionKey)it.next();
                 if (key.isReadable())
                 { 
                      SocketChannel sc = (SocketChannel) key.channel();

                      ByteBuffer bb;
                      if(key.attachment()==null)
                      {
                          bb = ByteBuffer.allocate(1024*1024);
                          key.attach(bb);
                      }
                      else
                      {
                          bb = (ByteBuffer)key.attachment();
                          bb.clear();
                      }

                      int x =  sc.read(bb); 

                       System.out.println(x +" bytes were read");
                       if(x==-1)
                       {
                           key.attach(null); //doesn't work
                           sc.close();
                           //bb = null; // also doesn't work
                       }
                 } 
             }
           keys.clear();
      } 
      catch (Exception ex) 
      {     
          ex.printStackTrace(new PrintStream(System.out));
      }
      finally
      { 
            //stopServer();
      }
    }

測試邏輯 - 我寫了簡單的TCP客戶端java程序向服務器發送100條消息。 我故意為每個連接分配大緩沖區 - 1MB。 當客戶完成他的工作時int x = sc.read(bb); 返回-1並執行以下代碼:

if(x==-1)
                           {
                               key.attach(null); //doesn't work
                               sc.close();
                               //bb = null; // also doesn't work
                           }

我用調試輸出檢查了它,這段代碼真的被執行但是任務管理器仍然顯示大量內存使用。 問題出在哪兒?

當然key.attach(null)有效。 如果沒有,附加非null對象也不起作用。 相同的代碼。

但是,在任何情況下,關閉SocketChannel取消密鑰,從而將密鑰從注冊的所有Selectors所有密鑰集中刪除,因此您無論如何都不會再次看到密鑰,因此它符合GC的條件,附件也是如此,無論你是否調用key.attach(null) ,這都是多余的。 您可能在其他地方有另一個對附件的引用,或者您的內存使用問題在其他地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM