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
Очевидно, показывающий использование памяти увеличивается с течением времени. Я предполагаю, что некоторые предположения о том, как память должна быть исправлена, ошибочны, но я изо всех сил пытаюсь понять, чего я здесь не вижу.
Спасибо!
Запустите еще много запросов и проверьте, не влияет ли OS на использование памяти в конечном итоге на плато. nodejs не обязательно возвращает всю неиспользуемую память обратно в ОС. Он может быть освобожден внутренне и доступен внутри nodejs для будущих распределений, но не возвращается обратно в ОС. – jfriend00