[英]java.nio.channels.ServerSocketChannel not closing properly
[英]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.