任务不会被破坏和填满内存
Tasks are not getting destroyed and filling up memory
考虑这个将整数放入列表的简单示例程序:
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,让我觉得只有用这种方法开始新任务,数据才会真正释放。
为什么任务完成后内存没有释放?我不明白为什么列表不是临时的并且一直占用内存。我做错了什么?
也许在主程序中添加task.Wait()。我认为正如所写的那样,主程序在任务完成之前就退出了。也许任务在退出时仍然被引用,因此减慢了 gc。
.NET 使用垃圾收集来释放未使用的内存。
当内存越来越低时,垃圾收集更有可能 运行。但除此之外,没有办法预测它什么时候会运行,或者你的记忆什么时候会被释放。
在任何一种情况下,一旦不再需要内存(或者在您的情况下任务完成时),垃圾收集都不会 运行。
这是正常现象。当您 运行 内存不足时,垃圾回收应该会尽快解决。
考虑这个将整数放入列表的简单示例程序:
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,让我觉得只有用这种方法开始新任务,数据才会真正释放。
为什么任务完成后内存没有释放?我不明白为什么列表不是临时的并且一直占用内存。我做错了什么?
也许在主程序中添加task.Wait()。我认为正如所写的那样,主程序在任务完成之前就退出了。也许任务在退出时仍然被引用,因此减慢了 gc。
.NET 使用垃圾收集来释放未使用的内存。
当内存越来越低时,垃圾收集更有可能 运行。但除此之外,没有办法预测它什么时候会运行,或者你的记忆什么时候会被释放。
在任何一种情况下,一旦不再需要内存(或者在您的情况下任务完成时),垃圾收集都不会 运行。
这是正常现象。当您 运行 内存不足时,垃圾回收应该会尽快解决。