簡體   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