我的Windows(8.1)通用项目中存在内存泄漏。由于我的项目非常庞大,我创建了一个小型示例项目,其唯一目标是模拟内存泄漏。我尝试了很多东西试图解决这个内存泄漏,但无济于事。
情况如下:应用程序包含一个列表,当单击按钮时,数据被添加到列表中,当单击第二个按钮时,列表将被清除。当项目被添加到列表时,我希望看到内存使用率上升,这确实发生了。但是,当我清除列表时,我希望将内存使用率降低到添加项目之前的水平。这不会发生。相反,内存使用量大约是MB(显然取决于添加到列表中的项目数),高于添加项目之前的内存使用量。
你能帮我解决这个问题吗?
这是将项目添加到列表中的代码:
private Custom_Observable_List leaking_items_list = new Custom_Observable_List();
private void AddItemsToList()
{
if (RESET_LIST_BEFORE_ADDING)
{
ClearItemsList();
}
if (ItemList.ItemsSource == null)
{
ItemList.ItemsSource = leaking_items_list;
}
for (int i = 0; i < AMOUNT_OF_ITEMS_TO_ADD; i++)
{
leaking_items_list.Add(new ObjectClass() { Content = ITEM_CONTENT + number_of_items_added });
number_of_items_added++;
}
}
这里ItemList是XAML中的ListView。未设置ItemSource时,仍会发生内存泄漏。我怀疑ObservableCollection的漏洞比使用ListView更多。
清除列表的代码:
private void ClearItemsList()
{
if (leaking_items_list.Count > 0)
{
leaking_items_list.Clear();
}
}
Custom_Observable_List类:
class Custom_Observable_List : ObservableCollection<ObjectClass>
{
public Custom_Observable_List()
{
}
public Custom_Observable_List(IEnumerable<ObjectClass> collection) : base(collection)
{
}
}
我认为必须在此处添加一些内容,以便它不会保留对添加到其中的对象的引用,以便垃圾收集实际上可以清除所有内容。但我不知道要添加什么。
以下是添加到列表中的对象类。
class ObjectClass : INotifyPropertyChanged
{
private string content = string.Empty;
public string Content
{
get { return content; }
set
{
if (content != value)
{
content = value;
NotifyPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我也试过在列表中添加字符串,然后发生了内存泄漏。我读到了应该实现INotifyPropertyChanged的地方,这就是我创建这个类的原因。
整个项目可以在这里找到:
我使用visual studio 2015及其诊断工具进行了测试。我已经验证程序在添加和清除几次后崩溃,因为内存使用率太高。