如何销毁SelectionKey附件?attach(null)不起作用

包尔赞

我的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHPMailer 附件不起作用

来自分类Dev

销毁在Java中不起作用

来自分类Dev

Rails活动销毁记录不起作用

来自分类Dev

Markdown在附件中不起作用

来自分类Dev

背景附件:修复不起作用

来自分类Dev

销毁在Ruby on Rails中不起作用的路径

来自分类Dev

销毁在Ruby on Rails中不起作用的路径

来自分类Dev

在应用程序销毁时保存变量不起作用

来自分类Dev

销毁所有预制克隆的实例不起作用

来自分类Dev

销毁 Tk 中的小部件不起作用

来自分类Dev

检查'!= null”不起作用

来自分类Dev

strstr == NULL不起作用,

来自分类Dev

!=null 或 !=undefined 不起作用

来自分类Dev

使用phpmailer从表单发送附件不起作用

来自分类Dev

触发附件对象在闪电体验中不起作用

来自分类Dev

UITableViewCell附件类型不起作用Xcode 6.0.3

来自分类Dev

连接到模拟USB附件时Logcat不起作用

来自分类Dev

触发附件对象在闪电体验中不起作用

来自分类Dev

联系表格7附件成功,但上传不起作用

来自分类Dev

发送带附件的数据不起作用 Cronjob

来自分类Dev

使用 Corda shell 上传附件不起作用?

来自分类Dev

带有多个附件的 gmail 不起作用

来自分类Dev

文件附件在Microsoft Bot Emulator中起作用,但在Skype中不起作用

来自分类Dev

文件附件在Microsoft Bot Emulator中起作用,但在Skype中不起作用

来自分类Dev

绑定了null的MyBatis变量不起作用

来自分类Dev

Video.attachCamera(null)不起作用

来自分类Dev

getJSONArray不起作用optJSONArray返回null

来自分类Dev

由于null,addEventListener将不起作用

来自分类Dev

绑定了null的MyBatis变量不起作用