2016-01-15 2 views
2

Я создал новый проект с одним файлом (server.js) на сервере с этим крошечным фрагментом кода, который ничего не делает. Но, после запуска, мой процесс узла использует около 1 ГБ памяти. Кто-нибудь знает, почему?Meteor.setTimeout() память утечка?

for (var i = 1000000; i >= 0; i--) { 
    Meteor.setTimeout(function(){},1000); 
}; 

Видимо Meteor.setTimeout() функция делает или использует что-то (замыкание?), Что предотвращает GC от очистки памяти после того, как она была выполнена. Есть идеи?

ответ

1

Поскольку вы вызываете это на стороне сервера, Meteor.setTimeout намного сложнее, чем кажется на поверхности. Meteor.setTimeout обертывает setTimeout с помощью Meteor.bindEnvironment(), который по существу связывает контекст текущей среды с обратным вызовом таймаута. Когда этот таймаут запускается, он будет тянуть в контексте, когда он был изначально вызван.

Хорошим примером может быть, если вы назвали Meteor.method() на сервере и использовали Meteor.setTimeout() внутри него. Meteor.method() будет отслеживать пользователя, вызвавшего метод. Если вы используете Meteor.setTimeout(), он привяжет эту среду к обратному вызову для тайм-аута, увеличив объем памяти, необходимый для пустой функции().

Что касается того, почему на вашем сервере не происходит сборки мусора, возможно, он не попал в его буфер. Я попробовал запустить тест, и моя виртуальная память достигла 1,2 гб, но никогда не повышалась даже после последующих тестов. Попробуйте запустить этот код несколько раз, чтобы узнать, продолжает ли потребление памяти увеличиваться линейно, или если он достигает потолка и перестает расти.

Смежные вопросы