Метод переподключения WebSocket, кажется, вызывает утечку памяти и не уверен, почему - PullRequest
0 голосов
/ 28 июня 2019

Описание:

Веб-розетка снова подключается через 5 секунд после закрытия или ошибки розетки.Я подозреваю, что ссылка на исходное сокетное соединение кэшируется в куче, и через некоторое время это накопление приводит к сбою веб-браузера.Я не уверен, что мое подозрение здесь верно.

Я изучил проверку памяти в Chrome Devtools и выяснил, что объекты WebSocket накапливаются, что в конечном итоге приводит к сбою браузера.Мой код выглядит очень похоже на эту логику Websocket , которая, кажется, является распространенным подходом, но я не уверен, почему происходит утечка памяти.

Снимок экрана памяти 1:

Это первый раз, когда устанавливается соединение (примечание: оно выполняется локально).enter image description here

Снимок экрана памяти 2:

Это результат после четвертого соединения (третьего переподключения), и вы можете видеть, что естьтеперь 10 объекты WebSocket в памяти.enter image description here

Если переподключение неоднократно завершается неудачей из-за состояний сокета closed/erred, через некоторое время память переполняется 1 ГБ и в конечном итоге происходит сбойбраузер.

Обновление снимка экрана памяти 3: enter image description here

Соответствующий фрагмент кода:

function webSocketConnection(url, callback) {
  const ws = new WebSocket(url);
  ws.onopen = e => console.log("socket connected");
  ws.onmessage = e => {
      if (callback) {
        callback(e);
      }
  };

  ws.onclose = function(e) {
    console.log("rt-closed:", e);
    setTimeout(function() {
      webSocketConnection(url, callback);
    }, 5000);
  };

  ws.onerror = function(error) {
    console.error("rt-error:", error);
    ws.close();
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...