默认的lodash memoize函数是否存在内存泄漏的危险?

时间:2016-07-26 21:24:36

标签: javascript lodash

我想使用memoize,但我担心缓存会无限增长,直到发生悲伤时为止。

我无法通过google / stackoverflow搜索找到任何内容。

P.S。我正在使用lodash v4。

2 个答案:

答案 0 :(得分:7)

除非您指定不同的缓存类型,否则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等没有任何规定:
哈希#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
地图#set:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/set

答案 1 :(得分:7)

简短的回答是否定的。

当您使用memoize功能时,您接受以下合同:

  1. 仅使用给定参数
  2. 调用该函数一次
  3. 只要保证#1(永远)
  4. ,缓存就会保留在那里

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

    经常混淆的是 - 内存泄漏"只是"效率低下的事情"使用记忆。

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