Grizzly 2.4.4 Закрытая утечка памяти в WebSockets - PullRequest
1 голос
/ 21 марта 2020

Меня попросили проанализировать дамп кучи, вызванный нехваткой памяти в среде. В проекте используется модуль веб-сокетов Grizzly 2.4.4.

Проблема заключается в том, что при высокой нагрузке (соединения с веб-сокетом) - когда соединения часто создаются и закрываются - старые закрытые соединения не собираются сборщиком мусора и вызывают утечку памяти.

В дампе кучи I заметил один и тот же шаблон для всех этих закрытых веб-сокетов - они как-то упоминаются живым (подключенным) веб-сокетом (начиная с G C root) через его индексированные атрибуты protocolHandler-> filterChainContext-> TcpNIOConnection.

Это выглядит как цепочка:
connected_websocket -> protocolHandler-> filterChainContext-> tcpNioConnection-> attribute-> websocketHolder -> old_closed_websocket -> ... .

Глядя на код, я не понял, как это на самом деле возможно - не должны ли экземпляры TcpNIOConnection быть независимыми и не ссылаться друг на друга?

Вот скриншот из дампа кучи, который более Пояснение: enter image description here

Обратите внимание на EmsWebSocket (он расширяет DefaultWebSocket - ничего особенного в нем) внизу. Это подключенная веб-розетка. И это относится к нескольким держателям веб-сокетов и TcpNIOConnections подряд, которые все закрыты. Как это вообще возможно воспроизвести? Я пробовал локально, но безуспешно.

Было бы здорово, если бы кто-то из разработчиков гризли мог прокомментировать это.

Заранее спасибо,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...