我的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)
可以。如果没有,则附加非空对象也将不起作用。相同的代码。
但是,无论如何,关闭SocketChannel
取消会取消该密钥,这会将其从注册的所有密钥集中删除Selectors
,因此无论如何您将再也看不到该密钥,因此它可以使用GC,而附件也是如此,无论如何是否打电话key.attach(null)
,这是多余的。您可能在其他地方引用了附件,或者在其他地方遇到了内存使用问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句