【发布时间】:2022-11-21 16:50:55
【问题描述】:
内存占用一开始是4660k,后来增加到6920k,但最终并没有减少。
演示
static void Main(string[] args)
{
string data = File.ReadAllText("./generated.json");
Console.WriteLine("Begin parsing data...");
for (var i = 0; i < 100; i++)
{
using (JsonDocument jsonDocument = JsonDocument.Parse(data))
{
}
Thread.Sleep(650);
}
Console.WriteLine("Batch task ends...");
GC.Collect();
Console.ReadLine();
}
这是我的generated.json
【问题讨论】:
-
怎么测的?没有实际测量各种内存消耗类型或 GC 世代的代码。如果您想要可用的数字,请将 BenchmarkDotNet 与 memory diagnosers 一起使用,以查看实际分配的内容
-
您是在 Debug 还是 Release 中运行代码?
-
此外,处置一个对象并不意味着删除它或它的缓冲区。特别是如果这些缓冲区是共享和重用的。 System.Text.Json 广泛使用池缓冲区,所以我猜
Dispose()将内部缓冲区释放回池中,以便可以重复使用。您发布的代码没有分配 100 个缓冲区,而是只分配 1 个缓冲区并重新使用它。该缓冲区最后没有被孤立,所以它不是 GCd -
@MatteoUmili 在调试中。
-
.NET 是开源的,Dispose 的代码表明,
Dispose()确实释放了租用的缓冲区。没有泄漏,恰恰相反