2016-02-21 4 views
1

I мысль Я понял использование памяти/сборку мусора в NodeJS, однако я не вижу, что я ожидаю при запуске очень простого HTTP-сервера NodeJS. Я создал самый маленький сценарий, который мог показать, что я пытаюсь сделать.Непонимание использования памяти/сборка мусора

С моей точки зрения, после того, как переменные/буферы выходят из сферы видимости, они должны собирать мусор, но я этого не вижу. Мои буферы, похоже, сохраняются, и поэтому использование общей памяти продолжает расти.

Пример ниже:

var http = require("http"), 
 
\t args = process.argv.slice(2), 
 
\t port = Number(args[0]) ? args[0] : 8080 
 

 
http.createServer(function(request, response) { 
 

 
\t console.log(Date(), request.url, process.memoryUsage().rss/1024/1024) 
 
\t var s3url = 'http://hmn-uploads-eu.s3.amazonaws.com/yell-production/uploads/2016/01/BYC-Hero-Home-Small.jpg' 
 
\t var buffer = '' 
 
\t http.get(s3url, function(s3response) { 
 
\t \t s3response.on('data', function(data) { 
 
\t \t \t buffer += data 
 
\t \t }) 
 
\t \t s3response.on('end', function() { 
 
\t \t \t response.write(buffer) 
 
\t \t \t response.end() 
 
\t \t }) 
 
\t }) 
 
}).listen(parseInt(port, 10)) 
 

 
console.log("Server running at\n \t => http://localhost:" + port + "/\nCTRL + C to shutdown");

По сути я просто загрузив файл и служить ему в качестве ответа. I ожидать буферов для сбора мусора после завершения запроса (по мере возврата функции и отсутствия внешних ссылок на буферы). Однако мой каротаж показывает это:

Server running at 
 
\t => http://localhost:8080/ 
 
CTRL + C to shutdown 
 
Sun Feb 21 2016 16:26:28 GMT+0000 (UTC)/10.20703125 
 
Sun Feb 21 2016 16:26:30 GMT+0000 (UTC)/14.69140625 
 
Sun Feb 21 2016 16:26:31 GMT+0000 (UTC)/15.22265625 
 
Sun Feb 21 2016 16:26:32 GMT+0000 (UTC)/16.26171875 
 
Sun Feb 21 2016 16:26:33 GMT+0000 (UTC)/17.8125 
 
Sun Feb 21 2016 16:26:34 GMT+0000 (UTC)/18.28515625 
 
Sun Feb 21 2016 16:26:36 GMT+0000 (UTC)/18.55078125 
 
Sun Feb 21 2016 16:26:37 GMT+0000 (UTC)/18.81640625

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

Спасибо!

+0

Запустите еще много запросов и проверьте, не влияет ли OS на использование памяти в конечном итоге на плато. nodejs не обязательно возвращает всю неиспользуемую память обратно в ОС. Он может быть освобожден внутренне и доступен внутри nodejs для будущих распределений, но не возвращается обратно в ОС. – jfriend00

ответ

1

Сборщик мусора в NodeJS не будет нажимать, пока использование памяти не превысит определенный порог. Я нашел следующую страницу, чтобы быть интересным для чтения: (! Включая обнажая сборщик мусора, так что его можно назвать вручную)

http://blog.yld.io/2015/08/10/debugging-memory-leaks-in-node-js-a-walkthrough/

На странице несколько методов диагностики утечки памяти и использование кучи объясняются

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