Эффективное управление памятью JavaScript на стороне сервера в express / node.С. API

обзор

Я сделал некоторое чтение по управлению памятью JavaScript в прошлом и знаю о проблеме с круговыми ссылками DOM и т. д.

однако мне все еще немного неудобно, поскольку это переводится в серверную среду JavaScript, такую как узел.js, и более конкретно API, написанный на экспресс.


взять этот файл (назовем это сервер.в JS)

var npm_moduleA = require('npmA')({ someInitArg : 'blah' }),
    app = express.createServer();

app.get('/api/foo', function (req, res) {

    var result = npm_moduleA.doSomething();
    res.send(result);

});

app.get('/api/bar', function (req, res) {

    var npm_moduleB = require('npmB')({ someInitArg : 'blah' }),
        result = npm_moduleB.doSomethingElse();

    res.send(result);

});

вопросы (предполагая, что это сайт с высокой нагрузкой)

  1. каков жизненный цикл npm_moduleA? он создается в момент запуска сервера, но когда (если вообще GC работает против него) - я предполагаю, что он никогда не трогается, потому что его в глобальной области?

  2. In ' / api / bar/', should npm_moduleB удаляться после каждого запроса? или это должно быть оставлено на GC один.

  3. глобальный экземпляр npm_moduleA значительно эффективнее, чем повторное создание экземпляра (и возможное удаление)npm_moduleB?


ссылки

1 ответов


как узел.js не будет создавать и уничтожать запущенный контекст для каждого вызова, поэтому оба npm_moduleA и npm_moduleB будет жить (в кэше), пока вы не убьете сервер.

на самом деле независимо от того, где вам нужен модуль, он просто получает указатель на точку входа модуля. во время выполнения он ничего не создает.

вот пример:

.js
var t = require('./module.js');
t.value = 10;

function test() {
  var t2 = require('./module.js');
  console.log(t2.value);
}

test();

модуль.js

module.exports = {};

консоль выводит:

10

в этом case просто поставьте require () s в глобальную область на этот раз. не делайте requires в обратных вызовах, потому что require () имеет некоторую работу по разрешению имен файлов, и она не отличается от require в глобальной области (в любом аспекте.)

но если вы собираетесь экземпляр класса new SomeClass(), то, где вы это делаете, имеет значение.