2016-03-09 3 views
0

Сейчас я работаю с nodejs проектом, в котором один из контроллера выглядит следующийПонимания nodejs памяти утечка

var express = require('express'), 
    router = express.Router(), 
    blah = require('blah'), 
    Foo = require('../models/foo'); 


/* Get all foos */ 

router.get('/', function (req, res) { 
    Foo 
     .getAll() 
     .then(function (foo) { 

      return res.json({ 
       foo: blah(foo) 
      }); 
     }) 
     .catch(function (err) { 
      //handle error; 
     }); 
}); 

/* 
* Some other functions 
* 
*/ 

Необходимый модуль л и модель Foo используется внутри маршрутизатор конечной точки. Согласно этой статье http://www.ibm.com/developerworks/library/wa-memleak/, я предположил, что сборщик мусора не будет собран из-за того, что на него ссылается замыкание внутри него и может создать утечку памяти.

В таком случае, какой правильный способ освобождения памяти?

ответ

2

Модули кэшируются в node.js, поэтому они не должны течь. Они будут загружаться один раз, а затем в любое последующее время, когда они запрашиваются, изначально загруженный модуль возвращается. Таким образом, require() не должен генерировать утечку. Первоначальная загрузка займет некоторую память, но последующие нагрузки не должны занимать больше памяти. Если вы вызываете конструктор модуля или какой-либо другой метод модуля, который использует память, то этот метод стоит сам по себе.

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

Если это не совсем то, о чем вы просили, пожалуйста, уточните, что вы думаете, может быть утечка в вышеуказанном коде.

+0

Мне не нужно использовать модель Foo = require ('../ models/foo'); после того, как я с ним справился. Так я должен назначить его null после окончания работы с ним? –

+2

@MuhammadRaihanMuhaimin - Прежде всего, установка 'Foo = null' не сохранит вам никакой памяти. Модуль уже находится в кеше модуля, поэтому это ничего не освободит. Во-вторых, как можно «сделать» с «Foo»? Ваш 'router.get()' регистрирует обработчик маршрута, который все равно может попасть в любое время в будущем. – jfriend00

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