默认的lodash记忆功能是否有内存泄漏的危险
Is the default lodash memoize function a danger for memory leaks?
我想使用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#L1832ListCache#set
:https://github.com/lodash/lodash/blob/4.14.0/lodash.js#L1940Map#set
:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/set
简短的回答是否定的。
当您使用memoize
函数时,您接受的合同为:
- 对于给定的参数,函数只能调用一次
- 只要有必要保证#1,缓存就会一直存在(永远)
因此,只有永久保存数据的实现才能符合要求。
人们经常感到困惑的是,"内存泄漏"只是内存的"低效"使用。
在这种情况下,如果这对你来说是个问题,那么你有责任在对你的算法有利的时候重新创建一个记忆函数。因为只有你知道什么时候这样做是安全的,而这是不可能自动完成的。
相关文章:
- 重复应用 d3 转换导致的内存泄漏
- IE7中的blockUI插件内存泄漏25kb
- Javascript闭包-如何防止内存泄漏
- jQuery Draggable:内存泄漏
- "检测到可能的EventEmitter内存泄漏”;使用Gulp+Watchify+Factor捆绑包
- 在Dojo类中递归调用setTimeout时是否存在内存泄漏
- 是内存泄漏
- 将处理程序留在img.onload上是内存泄漏
- 具有并发sse连接的node.js内存泄漏
- 简单对象的Javascript内存泄漏
- WeakMap是否会将我从父/子关系的内存泄漏中拯救出来
- Javascript绘制画布内存泄漏
- Node.js”;检测到EventEmitter内存泄漏”;
- 正在清理内存泄漏
- 递归Javascript对象是否会导致任何问题(内存泄漏)
- Angular JS$编译服务导致$watch内存泄漏
- 如何防止和防范闭包内存泄漏
- 跟踪 JavaScript 内存泄漏的工具
- 页面刷新后javascript内存泄漏有问题吗?为什么?
- XMLHttpRequest循环内存泄漏