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
相关产品推荐
相关产品推荐

