Proxy 本身不提供自动清理机制,但可结合 WeakMap、WeakRef 或 FinalizationRegistry 实现资源自动释放:WeakMap 避免强引用导致内存泄漏,FinalizationRegistry 在对象销毁时执行清理回调,WeakRef 支持安全延迟访问,三者协同可构建无内存泄漏的响应式系统。

Proxy 本身不提供自动清理机制,但可以结合 WeakMap、WeakRef 或 FinalizationRegistry 构建响应式或资源自动释放的逻辑。关键在于利用 Proxy 拦截访问行为,配合弱引用容器追踪对象生命周期,而非依赖 Proxy 自身“销毁”对象。
用 WeakMap 缓存代理状态,避免内存泄漏
Proxy 的 handler 中若直接用普通 Map 存状态,会强引用目标对象,阻止 GC。WeakMap 只接受对象作为键,且不阻止其被回收:
- 创建 WeakMap 实例(如
const cache = new WeakMap()) - 在 Proxy handler(如
get、set)中,用cache.get(target)获取关联状态 - 若未命中,初始化并存入:
cache.set(target, { dirty: false, timestamp: Date.now() }) - 当原始对象被 GC 后,WeakMap 中对应条目自动消失,无需手动清理
配合 FinalizationRegistry 实现真正“清理”动作
WeakMap 只能被动释放缓存,若需在对象销毁时执行副作用(如关闭连接、释放句柄),用 FinalizationRegistry:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 注册时传入要监听的目标对象、回调函数和可选的持有值(如资源 ID)
- 回调中不能访问目标对象(它已不可达),但可安全执行清理逻辑
- 示例:
registry.register(obj, () => console.log('obj 已释放'), 'resource-123') - 注意:回调时机不确定,仅适合非关键清理;关键资源仍需显式释放
用 Proxy 拦截 + WeakRef 延迟访问,避免提前释放
当需要在 Proxy 内部“暂存”对目标对象的引用,又不想阻碍 GC,可用 WeakRef:
- 创建:
const ref = new WeakRef(target) - 在 handler 中通过
ref.deref()获取目标(可能为undefined) - 若返回
undefined,说明目标已被回收,可触发降级逻辑或抛出错误 - 适用于缓存、观察器等场景,确保 Proxy 不意外延长对象存活时间
实际组合:带自动释放的响应式对象
一个典型模式是:用 Proxy 拦截属性读写,WeakMap 存响应式依赖关系,FinalizationRegistry 清理订阅:
- 每次
get时,将当前 effect 记录到 WeakMap 中以 target 为键的依赖列表里 - target 被 GC 后,WeakMap 条目消失,后续 effect 不再触发
- 同时
registry.register(target, cleanupEffect, effectId),确保 effect 彻底移除 - 这样既保持响应式能力,又不会因 Proxy 或缓存导致内存泄漏

















