【发布时间】:2018-10-11 12:19:58
【问题描述】:
经典蔚来客户端:
Create a selector
Register channel to selector for READ WRITE
Loop:
select
iterate selectedKeys
do work for Readable channel and Writeable channel
我像上面一样为android编写了一个简单的UDP NIO客户端,但发现每10秒就有30k+ HashMapNode内存分配。由于通道同时涉及 READ 和 WRITE,因此 select() 调用由于它是可写的而立即返回,在每个 select() 期间,至少一个 SelectionKey 被添加到 SelectedKeys() 返回的 HashMap 中。 我将设计更改为在开始时仅注册 READ,并以较小的超时时间(例如 10 毫秒)调用 select(),如果要写入的缓冲区不为空,则注册 WRITE,进行写入,然后再次注册 READ , 内存分配问题已修复,但写入操作会延迟,因为您必须等待 READ 选择超时。
有更好的方法吗?
【问题讨论】:
-
或者我应该在添加一些东西写入缓冲区之后立即添加一个 selector.wakeup() 调用吗?