javascript - 对象的部分垃圾收集可能吗? (服务器端JS)

标签 javascript node.js caching garbage-collection v8

假设一个服务器端 JavaScript 环境,提供如下功能:

var parseIsoDuration = /... complex regex .../

function dateDiff(date, isoDurationStr){
    var duration = parseIsoDuration.exec(isoDurationStr);
    return timeLibrary.add(date, duration);
}

该函数将从外部在数百个日期调用,但大多数情况下 ISO 持续时间相同。由于 RexExp 解析不是一个廉价的操作,因此可以实现应用程序级缓存:

var parseIsoDuration = /... complex regex .../
var durationCache = {}

function dateDiff(date, isoDurationStr){
    var duration;
    if (durationCache[isoDurationStr] === undefined){
        duration = parseIsoDuration.exec(isoDurationStr);
        durationCache[isoDurationStr] = duration;
    } else {
        duration = durationCache[isoDurationStr];
    }
    return timeLibrary.add(date, duration);
}

问题:服务器可能会连续运行一年,而缓存对象永远不会超出范围。如果使用许多不同的 ISO 持续时间字符串调用该函数,缓存将随着时间的推移而增长,并且永远不会减小其大小。

有没有办法告诉 V8 它可以根据需要从缓存对象中清除“旧”条目(即已经变得太大)?或者至少在需要的时候把它完全说清楚? (解决方案可能取决于ES6/7特性)

ES6 WeakMap 听起来很有趣,但它们只接受对象作为键。将字符串包装在数组中以使其成为对象是行不通的,因为再次这样做将产生不同的对象。我需要类似 Symbol(str) 的东西,但它会为两个相同的输入返回相同的引用 (Ref(str) === Ref(str))。

编辑:实际上有Symbol.for("str") === Symbol.for("str"),但它不被接受为WeakMap键。

我也不确定在 WeakMap 的情况下条目何时真正被垃圾收集 - 它可能或多或少是立即进行的,因为在将对象添加到 WeakMap 后不会立即引用该对象。所以是双重否。

取消设置单个 key 将需要在添加 key 时进行额外的簿记,并需要一些算法来确定合理的 TTL。

是否有必要缓存 RegExp 结果?有内置缓存吗?对于文字表达式或仅通过构造函数创建,或两者兼而有之?

最佳答案

你所说的听起来像Java的SoftReference不,v8 中没有这样的东西。相反,您应该自己管理缓存或使用类似 lru-cache 的模块之一

关于javascript - 对象的部分垃圾收集可能吗? (服务器端JS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32397729/

相关文章:

javascript - 未调用 polymer 按键事件处理程序

Javascript 运费计算器不抓取输入

javascript - jquery 选项卡默认选项卡

javascript - 将\u00f0\u009f\u0098\u008a 等 Facebook json 文件序列转换为表情符号字符

caching - 如何使用 must-revalidate 缓存 HTML 页面?

javascript - 在 div 列表中添加和删除类以创建内容 slider

node.js - Stripe API Trial_end 从现在起 10 秒后,与环境无关

node.js - promise map 保持秩序

java - 如何使用Hibernate缓存表数据并加速查询?

linux - 在 Linux 用户空间应用程序中启用写入组合?