什么时候会在 Express 应用程序上设置 GC 免费变量?

When would GC free variable set on express app?

我正在尝试在 Express 应用程序上存储一些持久性数据。 在我的以下示例中,我有一个函数 getProductPrice 存储从产品名称到其价格的映射。如果价格不存在,它会从外部获取数据并将其存储在一个对象中 (productNameToPrice)。 getProductPrice 在 Express 应用程序上设置 app.set('getProductPrice', getProductPrice)

映射 productNameToPrice 是否会在应用 运行 期间持续存在,或者 GC 是否会在某个时候释放内存?

示例代码如下:

//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);

...

When would GC free variable set on express app?

设置为 app.set() 的对象将永远不会被垃圾回收,只要设置它的 app 仍然存在并且在某些变量中仍然存在对它的可访问引用。因此,在正常的 Express 应用程序设计中,在进程关闭之前,它永远不会被垃圾收集。要让 app 被垃圾回收,您必须停止服务器并覆盖对 app 变量的所有可能引用,这样就不再有对该 app 对象的任何可访问引用。

因此,只要您不是故意这样做,您使用 app.set() 设置的数据就不会被垃圾回收。垃圾收集器的工作是在任何实时代码无法访问并且无法再以任何方式使用时清理事物。他们不会清理您的代码仍然可以访问的内容。因此,由于 app.get() 可以检索使用 app.set() 设置的值,因此在不再有任何代码引用 app 之前,该值不能被垃圾回收。