S30N1K

Пользователь

Регистрация: 24.09.2014

Сообщения: 7717

Рейтинг: 5198

S30N1K

Регистрация: 24.09.2014

Сообщения: 7717

Рейтинг: 5198

Может я дурак чего не понимаю, но инфы так и не нашел, нашел, но она спорная.

Суть: допустим есть что то типо такого (ага, скрином, так ясней)


85af9247f320.png


Вопрос, собсна, на скрине.

Много где советуют (в подобных вопросах до года 20+-) перед socket.emit делать проверку, жив ли клиент.

Якобы, если такую проверку не сделать, то это создаст черную дыру и сожрет всю оперативку со временем.


Якобы смысл такой, что если вызвать socket.emit к уже закрытому сокету, то по какой-то из причин он зависнет и сборщик мусора его не удалит.

Мучал поисковик, мучал нейросети, GPT5 вообще несколько раз проверку высрала на строк 300+ жив ли сокет monkamega.png


@Александр памаги PepeBaited.png

XaXoLOL

Пользователь

Регистрация: 15.10.2018

Сообщения: 2866

Рейтинг: 1139

XaXoLOL

Регистрация: 15.10.2018

Сообщения: 2866

Рейтинг: 1139

я вебе не шарю, но...

а как emit сработает, если сокет закрыт?

если у тебя здесь будет одно действие emit, ну да, один раз утечет по идеи, но т.к. больше объект нигде не исопльзуется сборщик должен будет его собрать.


если это бесконечный цикл который никогда не закрывается - то и правда пахнет утечкой памяти.


GaweR

Пользователь

Регистрация: 14.04.2013

Сообщения: 3836

Рейтинг: 3966

GaweR

Регистрация: 14.04.2013

Сообщения: 3836

Рейтинг: 3966

S30N1K сказал(а):

@Александр памаги PepeBaited.png

Нажмите, чтобы раскрыть...

Ты не того квотнулpepecool.png

@AndreyName

Almighty One

Пользователь

Регистрация: 20.10.2019

Сообщения: 10467

Рейтинг: 5341

Almighty One

Регистрация: 20.10.2019

Сообщения: 10467

Рейтинг: 5341

я не прогер конечно и может щас фигню напишу, но если ты уже понял из чего проистекает проблема, в чем собственно вопрос? ну сделай проверку как тебе гпт посоветовал, разве что наверное покомпактнее dankpepe.png

Talkee

Пользователь

Регистрация: 20.07.2013

Сообщения: 715

Рейтинг: 214

Talkee

Регистрация: 20.07.2013

Сообщения: 715

Рейтинг: 214

Если тебя интересует есть ли утечка, то почему бы не поэкспериментировать и вызвать оом/посмотреть хип дамп.

Александр

Почетный пользователь

Регистрация: 10.08.2013

Сообщения: 5670

Рейтинг: 4405

Александр

Регистрация: 10.08.2013

Сообщения: 5670

Рейтинг: 4405

оффтоп

Ниже будет чисто ИМХО из опыта работы с socket.io


Если ты делаешь одиночный emit к коннекту пользователя (socket.emit) и пользователя нет, то он должен просто уйти в никуда. Оно не хранится нигде дополнительно и не ожидает появления клиента alife, так что тут не совсем понимаю, почему должна быть утечка памяти - после отправки он за собой всё и так почистит. Если по какой-то неведомой причине пакет не дошёл до клиента, то не будет никакого подтверждения, что он его получил (UDP)

Если ты делаешь emit к руме (socket.to(code).emit), то он получит, кто есть в руме, и потом разошлёт всем

Если ты выходишь (вручную или обрыв не по твоей вине, событие disconnect), то он удалит тебя из румы и всё


НО


Если у тебя какое-то условие, которое таймером спамит клиенту (тяжело представить адекватное использование в таком ключе, но пусть будет как пример), и вызывается оно из connection, то да, стоит каждый раз проверять внутри таймаута, жив ли юзер, т.к. этот таймер не удалится при дисконнекте юзера и будет жить вечно, и сокет будет вечно слать в несуществующий коннект данные, пока ты не ребутнешь ноду. Вот тут будет утечка памяти, да

S30N1K

Пользователь

Регистрация: 24.09.2014

Сообщения: 7717

Рейтинг: 5198

S30N1K

Регистрация: 24.09.2014

Сообщения: 7717

Рейтинг: 5198

Talkee сказал(а):

Если тебя интересует есть ли утечка, то почему бы не поэкспериментировать и вызвать оом/посмотреть хип дамп.

Нажмите, чтобы раскрыть...

Да поэкспериментировать то поэкспериментировал, но если не уверен - то лучше спросить)

Может все же будут какие тонкости, о которых я не додумаюсь/не найду сразу.

10kk

Пользователь

Регистрация: 07.11.2025

Сообщения: 45

Рейтинг: -2

10kk

Регистрация: 07.11.2025

Сообщения: 45

Рейтинг: -2

откуда здесь утечка возьмется?

Божевильный

Премиум

Регистрация: 29.10.2021

Сообщения: 7522

Рейтинг: 2966

Нарушения: 40

Божевильный

Регистрация: 29.10.2021

Сообщения: 7522

Рейтинг: 2966

Нарушения: 40

Александр сказал(а):
оффтоп

Ниже будет чисто ИМХО из опыта работы с socket.io


Если ты делаешь одиночный emit к коннекту пользователя (socket.emit) и пользователя нет, то он должен просто уйти в никуда. Оно не хранится нигде дополнительно и не ожидает появления клиента alife, так что тут не совсем понимаю, почему должна быть утечка памяти - после отправки он за собой всё и так почистит. Если по какой-то неведомой причине пакет не дошёл до клиента, то не будет никакого подтверждения, что он его получил (UDP)

Если ты делаешь emit к руме (socket.to(code).emit), то он получит, кто есть в руме, и потом разошлёт всем

Если ты выходишь (вручную или обрыв не по твоей вине, событие disconnect), то он удалит тебя из румы и всё


НО


Если у тебя какое-то условие, которое таймером спамит клиенту (тяжело представить адекватное использование в таком ключе, но пусть будет как пример), и вызывается оно из connection, то да, стоит каждый раз проверять внутри таймаута, жив ли юзер, т.к. этот таймер не удалится при дисконнекте юзера и будет жить вечно, и сокет будет вечно слать в несуществующий коннект данные, пока ты не ребутнешь ноду. Вот тут будет утечка памяти, да

Нажмите, чтобы раскрыть...

бывало не отправляло если ссылку с картинкой приложил