Итак, у меня есть простейший пример socket.io:
'use strict';
const server = require('http').createServer();
const io = require('socket.io')(server);
server.listen(8080, function () {
});
io.on("connection",function(socket){
socket.on('disconnect', function (data) {
});
socket.on('sync', function(data) {
});
socket.on('enter', function(data) {
});
});
Я протестировал этот код с помощью простого скрипта Artillery.io, который просто имитирует 60 пользователей, приходящих в течение 60 секунд и отправляющих по 600 бессмысленных «синхронизирующих» сообщений каждый. Я создал несколько снимков кучи и обнаружил, что память постоянно выделяется конструкторами (массив) , (скомпилированный код) и (система) . На самом деле я вижу выделение и удаление памяти, но дельта по-прежнему всегда положительна:
В конструкторе (массив) я вижу некоторые 'deoptimization_data' , 'переходы' и другие, вероятно, внутренние объекты V8. Когда я смотрю на вкладку Retainers, я вижу, что на эти объекты как-то ссылаются разные объекты node.js и socket.io. Если вы запустите этот проект самостоятельно и сделаете несколько снимков кучи с помощью Chrome DevTools, вы, вероятно, увидите то же самое.
У меня также есть свое собственное приложение (простая игра с использованием socket.io, которое я тестировал без artillery.io), и когда я делаю снимки кучи во время игры, я замечаю, что у меня нет утечек памяти, связанных с моими собственными объектами (слава Богу) XD), но я все еще получаю такое же непрерывное распределение памяти с теми же конструкторами (массив) , (скомпилированный код) и (система) . И я снова вижу это 'deoptimization_data' , 'transitions и другие объекты V8. Это выглядит примерно так:
Эти три конструктора медленно потребляют мою память даже с самым простым примером socket.io, который я мог создать. Что они и что я могу с ними сделать, чтобы остановить утечки памяти?