[英]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.