Потенциальная утечка памяти в сеансах веб-сокетов в пристани (9.4.15) - PullRequest
1 голос
/ 24 апреля 2019

У меня есть служба, которая принимает и создает несколько сеансов websocket назад и вперед (они закрываются, а затем снова открываются и т. Д.). Для закрытия сеансов websocket я вызываю метод close объекта webSocketSession пружины, который, как я полагаю, связан с собственным объектом WebSocketSession объекта Jetty.

Мой сервис работает с весенней загрузкой (1.5.20) со встроенным сервером Jetty (9.4.15) и использует G1 GC с параметрами по умолчанию (возможно, будет настроен позже)

В последнее время кажется, что у этого сервиса есть утечка памяти, которую я пытаюсь исследовать. Я сделал дамп кучи после проверки от POV приложения, что у меня нет открытых сессий с моей стороны, и после того, как я вручную «форсировал» GC (используя JConsole).

Дамп кучи был получен с использованием JConsole с параметром live = true , поэтому я, безусловно, уверен, что у меня есть дамп после того, как GC выполнил на нем всю доступную очистку.

Я проанализировал дамп с помощью Eclipse MAT и обнаружил, что у меня ~ 8K WebSocketSession объекты, которые остаются живыми. Эта метрика каким-то образом пропорциональна аппликативной метрике, которую я показываю, и до сих пор моя служба работала с ~ 8K соединениями (8K входящих WS-соединений и 8K исходящих WS-соединений, где я использую Jetty в качестве WS-клиента).

Я проанализировал путь к корням GC к одному из этих объектов и обнаружил, что он поддерживается, среди прочего, некоторыми потоками Jetty (потоками qtp-XXX) и некоторыми планировщиками (см. Набор изображений ниже) enter image description here enter image description here enter image description here enter image description here Мои вопросы:

  1. Кто-нибудь сталкивался с таким поведением причала с проблемой высвобождения ресурсов веб-сокетов с течением времени?
  2. Я вижу некоторые потоки планировщика, которые также содержат сеансы websocket. Кто-нибудь знает, если это внутренние пристани? или они сделаны из весеннего загрузочного слоя? или что-то еще?
  3. Может ли быть, что Jetty хранит все сеансы внутри себя (даже те, которые были закрыты) и только периодически выпускает их? (или какой-то механизм, который объяснил бы, как у меня эти 8К якобы закрытые сеансы живы и активны?)
...