Geo*_*off 11 c# wpf memory-leaks mvvm listcollectionview
我一直在研究如何避免因INotifyCollectionChanged视图模型对事件的强引用而导致的内存泄漏.我正在玩一个ListCollectionView用来查看是否会为我处理它.我认为以下是泄漏记忆,我做错了什么?
var stuff = new ObservableCollection<string>();
while (true)
{
var result = new ListCollectionView(stuff);
// Just to keep make sure that the memory I'm seeing
// isn't waiting to be GC'd
GC.Collect();
}
Run Code Online (Sandbox Code Playgroud)
jco*_*and 10
我最初将此作为评论发布,但我认为这是一个更好的答案,所以...
a)如果您确定您发现.NET框架存在问题,那么您可能做错了什么.这不是不可能的,只是不太可能.b)GC.Collect()不会按照你的想法去做.
我想你需要回顾一下GC.Collect()的工作原理.
使用此方法尝试回收所有无法访问的内存.
所有对象,无论它们在记忆中存在多长时间,都被考虑收集; 但是,不会收集托管代码中引用的对象.使用此方法强制系统尝试回收最大可用内存量.
对于初学者,你没有告诉我们你在哪里处理那个记忆ListCollectionView(stuff).你只是分配新的和分配新的,但你永远不会丢弃旧的.所以,是的,它会像疯了一样泄漏.在GC运行并尝试收集之前.
如果你做同样的事情,你在这里展示一个字符串列表,它很可能会做同样的事情.但是对于你所展示的东西,我预计它会泄漏.
文档ListCollectionView不是很好,但如果你注意到有一种方法DetachFromSourceCollection.这个电话的评论提到取消订阅并允许垃圾收集.
var stuff = new ObservableCollection<string>();
while (true)
{
ListCollectionView result = new ListCollectionView(stuff);
//Use this method to unsubscribe to events on the underlying collection and allow the CollectionView to be garbage collected.
result.DetachFromSourceCollection();
//When finished set to null
result = null;
GC.Collect();
}
Run Code Online (Sandbox Code Playgroud)