Memory leaks 为什么Automapper使用了这么多内存?

Memory leaks 为什么Automapper使用了这么多内存?,memory-leaks,automapper,.net-4.5,Memory Leaks,Automapper,.net 4.5,我使用的是最新版本的Automapper(v3.0.0.0-ci1036),当它使用二进制数据转换对象时,它会使用大量内存。(对于10MB的文件,为200MB)。以下是此类“文件”Begging转换的示例: 类程序 { 静态void Main(字符串[]参数) { convertObject(); } 私有静态void convertObject() { var rnd=新随机数(); var fileContents=新字节[1024*1024*10]; rnd.NextBytes(文件内容)

我使用的是最新版本的Automapper(v3.0.0.0-ci1036),当它使用二进制数据转换对象时,它会使用大量内存。(对于10MB的文件,为200MB)。以下是此类“文件”Begging转换的示例:

类程序
{
静态void Main(字符串[]参数)
{
convertObject();
}
私有静态void convertObject()
{
var rnd=新随机数();
var fileContents=新字节[1024*1024*10];
rnd.NextBytes(文件内容);
var attachment=新附件{Content=fileContents};
CreateMap();
Console.WriteLine(“按enter键转换”);
Console.ReadLine();
var dto=Mapper.Map(附件);
Console.WriteLine(dto.Content.Length+“bytes”);
Console.ReadLine();
}
}
公共类附件
{
公共字节[]内容{get;set;}
}
公共类附件
{
公共字节[]内容{get;set;}
}

我的代码是否有问题,或者我是否必须停止对包含二进制数据的对象使用automapper?

我不确定,但您的原因可能是:

您的C#应用程序在.NET运行时工作,该运行时尽可能使用垃圾收集器清除堆内存

这种技术的副作用是分割堆内存。例如,您可能分配了100MB,其中40%可用于新变量,这些变量被分割成最大5MB的小块

在这种情况下,当您分配一个10 MB的新阵列时,.NET虚拟机没有空间分配它,即使它有40 MB的空闲空间

为了解决这个问题,它将可用堆内存上移到110MB(在最佳情况下),并为新字节数组分配新的10MB

另见:

映射后是否会恢复正常?不,它会一直保持这种状态,直到应用程序关闭。一个原因可能是您使用了字节数组:字节数组要求内存中的所有字节都是连续的。