2

我的 Windows (8.1) 通用项目中有内存泄漏。由于我的项目非常大,我创建了一个小型示例项目,其唯一目标是模拟内存泄漏。我已经尝试了很多方法来尝试解决此内存泄漏,但无济于事。

情况如下:应用程序包含一个列表,当点击一个按钮时,数据被添加到列表中,当点击第二个按钮时,列表被清除。当项目被添加到列表中时,我希望看到内存使用量上升,这确实发生了。但是,当我清除列表时,我希望看到内存使用量降至添加项目之前的水平。这不会发生。相反,内存使用量比添加项目之前高出大约 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,这就是我创建这个类的原因。

整个项目可以在这里找到:

Memory_Leak_Test.zip

我使用 Visual Studio 2015 及其诊断工具进行了测试。我已经验证了程序在添加和清除几次后崩溃,因为内存使用率太高。

4

0 回答 0