考慮這個將整數放入串列的簡單示例程式:
void Main()
{
Experiment experiment = new();
var task = Task.Run(experiment.Start);
}
public class Experiment
{
public async Task Start()
{
List<int> values = new();
for (int i = 0; i < 1000000000; i )
values.Add(i);
await Task.CompletedTask;
}
}
運行時,這將使用大約 7 GB 的記憶體。但是這些資料就留在那里。即使我清除串列或將其設定為空,該程式仍然占用 7 GB。當我再次運行它時,RAM使用率突然下降到10 MB,然后再次飆升至7 GB,讓我認為只有使用這種方法啟動新任務,資料才會真正釋放。
為什么任務完成后記憶體沒有釋放?我不明白為什么該串列不是臨時的并且一直占用記憶體。我究竟做錯了什么?
uj5u.com熱心網友回復:
.NET 使用垃圾回收來釋放未使用的記憶體。
當記憶體變低時,垃圾收集更有可能運行。但除此之外,沒有辦法預測它什么時候運行,或者你的記憶體什么時候被釋放。
無論哪種情況,只要不再需要記憶體(或在您的情況下完成任務時),垃圾收集都不會立即運行。
這是正常行為。當您的記憶體不足時,垃圾收集應盡快處理它。
uj5u.com熱心網友回復:
也許在主程式中添加 task.Wait() 。我認為主程式在任務完成之前就退出了。也許任務在退出時仍然被參考,因此減慢了 gc。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/366846.html
