Когда в приложении express будет установлена ​​свободная переменная G C? - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь сохранить некоторые постоянные данные в приложении express. В моем следующем примере у меня есть функция getProductPrice, которая хранит сопоставление названий продуктов и их цен. Если цена не существует, она извлекает данные извне и сохраняет их в объекте (productNameToPrice). getProductPrice установлено в приложении express с app.set('getProductPrice', getProductPrice)

Будет ли отображение productNameToPrice сохраняться до тех пор, пока приложение работает, или G C в какой-то момент освободит память?

Вот пример кода:

//Some external api that gives product prices
const getProductPriceFromApi = require('getProductPriceFromApi');

const productNameToPrice = {};
const getProductPrice = (productName) => {
  if (productName in productNameToPrice) {
    return productNameToPrice[productName];
  }
  const productPrice = getProductPriceFromApi(productName);
  productNameToPrice[productName] = productPrice;
  return productPrice;
};

...

const getProductPrice = require('./getProductPrice');
app.set('getProductPrice', getProductPrice);

...

1 Ответ

0 голосов
/ 07 февраля 2020

Когда в express app будет установлена ​​свободная переменная G C?

Объект с app.set() никогда не будет собирать мусор, пока app it было установлено, все еще жив, и есть некоторые доступные ссылки на него в некоторых переменных. Таким образом, в обычном Express проекте приложения он никогда не будет собирать мусор, пока процесс не будет остановлен. Чтобы получить app для сборки мусора, вам необходимо остановить сервер и перезаписать все возможные ссылки на переменную app, чтобы больше не было доступных ссылок на этот объект app.

Таким образом, пока вы не делаете это преднамеренно, данные, которые вы установили с помощью app.set(), не будут собираться мусором. Задача сборщика мусора состоит в том, чтобы убирать вещи, когда они больше не доступны для любого живого кода и больше не могут использоваться. Они не очистят то, что может быть достигнуто вашим кодом. Таким образом, поскольку app.get() может извлекать значение, установленное с помощью app.set(), это значение нельзя собирать, пока не будет кода, который больше не имеет ссылки на app.

...