繁体   English   中英

为什么清除 object 的内容不会释放 memory?

[英]Why clearing the content of an object does not free memory?

当我遇到以下情况时,我需要清理 object 并立即释放其分配的 memory,我该怎么办?

在创建一个包含 1000 万字的List<string>之后,进程 memory 上升到 ~150MB。

List<string> list = new();
int length = 10000000;
for (int i = 0; i < length; i++)
{
    list.Add("test");
}

Console.ReadLine();
list.Clear();
Console.ReadLine();

即使列表被清除,我也没有看到 memory 在那之后被释放。 请问有人可以给我一些指导吗?

您无法控制 C# 何时实际释放其 memory。 一旦你Clear编辑了一个列表,所有曾经在其中的项目都有资格被垃圾收集(假设没有其他东西持有对它们的引用,如给定的示例中),但你无法控制 C# 的确切时间垃圾收集器实际上会释放它们。

List.Clear只是用空值替换对每个已清除字符串的引用的所有副本。 所以列表中的实际缓冲区大小完全相同,其中的值都是零。 由于列表中只包含对文字池中单个字符串的引用,因此列表引用的所有对象都没有资格被收集(曾经在列表中的 object 仍然存在,因为它在字符串实习生中池,它是有根的)。

要真正清除内部列表缓冲区,您需要删除对列表本身的所有引用,或者在列表上设置较小的Capacity以创建一个新的、较小的缓冲区,以便收集旧的缓冲区。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM