Имам услуга, която приема и създава няколко websocket сесии напред и назад (те се затварят и след това се отварят отново и т.н.). За затваряне на сесиите на websocket извиквам метода close
обекта webSocketSession на spring, който е свързан вътре, предполагам, към собствения обект WebSocketSession на jetty.
Моята услуга работи с пролетно зареждане (1.5.20) с вграден сървър на кей (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) и от някои програмисти за планиране (вижте набор от изображения по-долу)
< img src="https://i.stack.imgur.com/TV9J0.png" alt="въведете описание на изображението тук">
Моите въпроси:
- Някой сблъсквал ли се е с подобно поведение на jetty с проблем с освобождаването на уебсокет ресурси с течение на времето?
- Виждам някои нишки на планировчика, които също държат сесиите на websocket. Някой знае ли дали това са вътрешни части на кея? или са предоставени от пролетния зареждащ слой? или нещо друго ?
- Възможно ли е Jetty да държи всички сесии вътрешно (дори тези, които са били затворени) и само периодично да ги освобождава? (или някакъв механизъм, който би обяснил как имам тези 8K уж затворени сесии живи и активни?)