Java NIO: избегать выделения памяти HashMapNode? - PullRequest
0 голосов
/ 10 октября 2018

Классический NIO-клиент:

Create a selector
Register channel to selector for READ WRITE
Loop: 
   select
   iterate selectedKeys
       do work for Readable channel and Writeable channel

Я написал простой UDP-NIO-клиент для Android, как описано выше, но находил 30k + HashMapNode выделения памяти каждые 10 секунд.Поскольку канал касался как READ, так и WRITE, вызов select () возвращался немедленно, так как он был доступен для записи, во время каждого select () в HashMap возвращался хотя бы один SelectionKey, возвращаемый SelectedKeys ().Я изменил дизайн, чтобы вначале регистрироваться только для чтения, и вызывал select () с небольшим тайм-аутом (скажем, 10 мс), и если буфер для записи не был пуст, зарегистрируйтесь для записи, выполните записи и зарегистрируйтесь для чтения снова, проблема с выделением памяти исправлена, но операция записи будет отложена, так как вам придется подождать таймаут выбора READ.

Есть ли лучший подход?

1 Ответ

0 голосов
/ 11 октября 2018

Хорошо, я думаю, что понял.Вот и все.

Основной цикл:

Open channel and configureBlocking(false)
Open selector
Register channel to selector, only concern about OP_READ
LOOP:
    selector.select() // No timeout
    if write buffer is empty or no channel been selected, continue
    LOOP for selectionKey in selectedKeys:
        if selectionKey is readable
             do read operation
        else if selectionKey is writeable
             do write operation
             register channel to OP_READ
        remove selectionKey from selectedKeys          

Запись:

write data to write buffer
register channel to OP_WRITE
selector.wakeup()
...