DSH 0.1.7 引入了基于引用计数的会话管理机制:主视图切换会话时会释放旧会话的引用,当引用计数归零,该会话的 generation(包含本地数据、作用域 Context 和历史窗口)会被销毁。切回该会话时,系统会重建一个新的 generation 并重新拉取历史记录(至少 50 条消息),这会导致界面显示“Loading history…”。
dsh-session-keepwarm 插件通过为最近使用过的会话持有额外的引用,防止其被销毁。切回这些会话时,可以直接复用内存中已加载的历史窗口,避免重复读取。该插件实现了一个基于 keepWarm 设置的 LRU(最近最少使用)缓存,在减少历史重读的同时控制内存占用。
基本信息¶
- 名称:dsh-session-keepwarm
- 作者:dzwalker
- 分类:记忆
- 许可证:MIT
核心功能¶
- 持有额外引用:为最近使用过的会话持有额外的引用,确保其不会因为引用计数归零而被销毁。
- 复用历史窗口:切回已保活的会话时,复用内存中已有的历史窗口。由于
Session.open()对已打开会话是幂等的,因此不会再次拉取历史。 - LRU 缓存:实现了一个 LRU 缓存,上限由
keepWarm设置决定,防止无限占用内存。 - 会话监控:监控
sessions.list快照,当检测到会话被切换到时,将其移动到 LRU 队列头部。 - 仅支持普通会话:只处理普通会话;子代理行有自己的生命周期管理,不受此插件影响。
- 轻量级保活:只保活客户端本地数据和历史流,不会启动或持有 Host Agent。
安装与启用¶
通过以下命令安装插件:
dsh plugin --profile web add dsh-session-keepwarm
安装后,在对应的 profile 中启用该插件。
配置与使用¶
插件的配置项定义在 session-keepwarm profile 条目下:
| 配置项 | 默认值 | 说明 |
|---|---|---|
enabled |
true |
总开关。设为 false 会释放所有被保活的引用。 |
keepWarm |
5 |
保活最近使用会话的数量。范围通常为 1 到 20。值越大,占用浏览器内存越多。 |
适用场景与限制¶
- 仅限同标签页:该插件只对同一个标签页内的会话状态有效。客户端不在标签页或浏览器之间共享会话状态(无 SharedWorker 或 BroadcastChannel),因此新窗口或新浏览器打开会话时仍需重新加载历史。
- 首次打开仍需加载:即使会话被保活,第一次在任何标签页打开该会话时,仍然需要加载历史记录。保活只影响“切走之后切回来”的场景。
- 退出条件:这是一个临时方案。如果上游 DSH 客户端添加了原生的“保留最近 N 个会话”设置或等价的延迟销毁策略,应优先使用上游设置并移除此插件。
总结¶
dsh-session-keepwarm 通过简单的引用计数补充,解决了 DSH 0.1.7+ 版本中会话切换时的历史重读问题。它适合需要频繁在多个会话间切换以减少历史加载延迟的用户,但需注意其内存占用与同标签页的限制。