You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ReactiveUI中ObservableCache内存超限:LimitSizeTo仅限制缓存未释放内存

问题解决:Observable Cache内存对象未随LimitSizeTo()限制减少

你的问题核心是**LimitSizeTo()只创建了缓存的过滤视图,底层缓存仍然保留了所有添加过的对象**,导致内存中存在超过1000个UnaryTrackModel实例。

错误原因分析

原代码中,你直接订阅_trackCacheObservable把所有对象都添加到了缓存实例caches中,随后调用caches.LimitSizeTo(1000).Subscribe()只是生成了一个仅显示1000条数据的视图,但底层缓存集合并没有移除超出限制的旧对象,这些对象仍然被缓存持有引用,自然不会被GC回收。

正确实现方式

需要将LimitSizeTo()集成到变更流的处理链路中,让它在对象被添加到缓存前就生效,确保超出数量限制时,旧对象会被从缓存中彻底移除。修改后的代码如下:

private IObservable<IChangeSet<UnaryTrackModel, long>> LoadAndMaintainCache()
{
    return ObservableChangeSet.Create<UnaryTrackModel, long>(cache =>
    {
        // 将源数据流转换为变更集,直接应用LimitSizeTo限制最大数量
        var limitedChangeSet = _trackCacheObservable
            .ToChangeSet(track => track.Id)
            .LimitSizeTo(1000);

        // 将处理后的变更集绑定到缓存,确保缓存仅保留最新的1000个对象
        var subscription = limitedChangeSet.Subscribe(cache);

        return subscription;
    }, track => track.Id);
}

额外排查点(若内存仍有问题)

如果修改后内存中还是存在大量UnaryTrackModel实例,需要检查以下场景:

  • 是否有其他订阅者、业务逻辑持有这些对象的引用(比如事件注册未取消、静态集合缓存、长生命周期对象的引用)
  • UnaryTrackModel类自身是否包含未释放的资源或强引用链,导致对象无法被GC回收

内容的提问来源于stack exchange,提问作者Never.More

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:35:14