默认的lodash记忆功能是否有内存泄漏的危险

Is the default lodash memoize function a danger for memory leaks?

本文关键字:内存 泄漏 危险 功能 lodash 记忆 默认 是否      更新时间:2023-09-26

我想使用memoize,但我担心缓存会无限增长,直到出现悲伤的时刻。

我在谷歌/stackoverflow搜索中找不到任何东西。

附言:我正在使用lodash v4。

Lodash保留所有已存储的数据,除非您指定不同的缓存类型。


默认缓存是lodash的MapCache:
https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L1968

存储的值存储在不同的数据结构中,这取决于密钥是否适合哈希(以及ES6-Map在环境中是否可用):

  • https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L1987
  • https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L5561

如果您查看所有这些数据结构的set方法,您会注意到没有提供任何类似LRU等的内容:

  • Hash#set:https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L1832
  • ListCache#set:https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L1940
  • Map#set:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/set

简短的回答是否定的。

当您使用memoize函数时,您接受的合同为:

  1. 对于给定的参数,函数只能调用一次
  2. 只要有必要保证#1,缓存就会一直存在(永远)

因此,只有永久保存数据的实现才能符合要求。

人们经常感到困惑的是,"内存泄漏"只是内存的"低效"使用。

在这种情况下,如果这对你来说是个问题,那么你有责任在对你的算法有利的时候重新创建一个记忆函数。因为只有你知道什么时候这样做是安全的,而这是不可能自动完成的。