簡體   English   中英

Java.nio.channels.ServerSocketChannel-accept()內存泄漏

[英]Java.nio.channels.ServerSocketChannel - accept() memory leak

我的Android應用程序中有服務器線程,需要在用戶決定關閉它時正確處理它。 我選擇非阻塞的ServerSocketChannel接受()客戶端。
並得到這個 問題

public class SocketServer extends Thread
{
  private static final String LOG_TAG  = "SocketServer";
  private boolean isRunning  = false;
  private ServerSocketChannel listener = null;

public void _stop()
{
  this.isRunning = false;
}

public void _start()
{
  this.isRunning = true;
  this.start();
}

private void free()
{
  try
  {
    listener.close();
  }
  catch (IOException e)
  {
    //Error handle
  }
  listener = null;
}

public SocketServer(int port)
{
  super();
  try
  {
     listener = ServerSocketChannel.open();
     listener.configureBlocking(false);
     listener.socket().bind(new InetSocketAddress(port));
  }
  catch (IOException e)
  {
    //Error handle
  }
}

public void run()
{
  SocketChannel client = null;
  while(isRunning)
  {
    try
    {
      client = listener.accept();//GC going mad
    }
     if(client != null)
                Log.i(LOG_TAG, "ACCEPTED CLIENT");

    catch (IOException e)
    {
      //Error handle
    }
  }
    free();
}  

我正在做的就是接受新客戶端-因為沒有傳入連接而為null ,然后再次執行直到服務器停止。
ServerClient 客戶端在啟動時為null ,如果沒有可用的連接,則由accept()分配為null

但是Java的垃圾收集器認為,什么客戶端通過某種方式由accept()或accept()初始化,從而以某種方式分配一些內存,該內存在每次while循環后由GC清除。
如果注釋accept()行(例如不執行任何操作)將根本沒有GC,那么問題完全在accept()中。

我認為這完全不對。

PS:如果有某種方法可以打破阻止ServerSocket accept()/ Socket read()狀態並正確退出的情況,請告訴我。

PS 2就套接字而言,對SocketChannel socket()進行寫入/讀取是否安全,會阻塞線程嗎?

Java中的許多操作都在內部創建臨時對象以完成其工作。

使用阻塞的SocketServer會更好。 這樣,它創建的對象僅基於每個套接字,而不是每個嘗試。

我建議您首先為每個連接使用一個(或兩個)線程來實現阻塞NIO。 如果然后發現線程數量存在性能問題,請嘗試使用具有非阻塞NIO的選擇器。

暫無
暫無

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

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