【发布时间】:2022-07-19 19:33:29
【问题描述】:
有什么方法可以诊断非托管内存泄漏?
我正在使用带有 NETCode (barcode) 库的 .NET 5.0 控制台应用程序。它本身的程序很简单,它调用条形码库并从图像创建一个 base64 字符串 5000 次,我正在使用“使用块”,因此也正在处理处置。
static void Main(string[] args)
{
Console.ReadKey();
for (int i = 0; i < 5000; i++)
{
Barcode bar = new Barcode("123456789123456", Type.Code128);
using (var image = bar.GetImage())
{
using (MemoryStream ms = new MemoryStream())
{
image.Save(ms,ImageFormat.Png);
var base64 = Convert.ToBase64String(ms.ToArray());
Console.WriteLine(i);
}
}
}
Console.ReadKey();
Console.ReadKey();
}
在 Windows 上,该程序消耗 15-25 MB(不会超过此值),但在 Linux 上,非托管内存会随着每次迭代而不断增加,但根本不会下降(在 5000 次迭代中达到 600MB)。
Linux 点内存:
Windows 点内存:
我在修复 Font, FontFamily 处理问题后尝试了相同的程序,但结果相同。 我面临与 J4LBarcode、BarcodeLib 相同的问题。
我正在使用 docker:
FROM mcr.microsoft.com/dotnet/aspnet:5.0.15-focal as base
FROM mcr.microsoft.com/dotnet/sdk:5.0.406-focal AS build
带有 dockerfile 和 dotmemory 快照的完整演示可以在 here 找到。
【问题讨论】:
-
我看到
new,但我没有看到delete -
@stark 我不明白?
标签: linux docker memory-leaks .net-5 dotmemory