Описание:
Веб-розетка снова подключается через 5 секунд после закрытия или ошибки розетки.Я подозреваю, что ссылка на исходное сокетное соединение кэшируется в куче, и через некоторое время это накопление приводит к сбою веб-браузера.Я не уверен, что мое подозрение здесь верно.
Я изучил проверку памяти в Chrome Devtools и выяснил, что объекты WebSocket накапливаются, что в конечном итоге приводит к сбою браузера.Мой код выглядит очень похоже на эту логику Websocket , которая, кажется, является распространенным подходом, но я не уверен, почему происходит утечка памяти.
Снимок экрана памяти 1:
Это первый раз, когда устанавливается соединение (примечание: оно выполняется локально).
Снимок экрана памяти 2:
Это результат после четвертого соединения (третьего переподключения), и вы можете видеть, что естьтеперь 10 объекты WebSocket в памяти.
Если переподключение неоднократно завершается неудачей из-за состояний сокета closed/erred
, через некоторое время память переполняется 1 ГБ и в конечном итоге происходит сбойбраузер.
Обновление снимка экрана памяти 3:
Соответствующий фрагмент кода:
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();
};
}