Esp*_*spo 5 memory-leaks automapper .net-4.5
我使用的是最新版本的 Automapper (v3.0.0.0-ci1036),当它用二进制数据转换对象时,它使用了大量的内存。(10MB 文件为 200MB)。下面是这样一个“文件”开始转换的例子:
class Program
{
static void Main(string[] args)
{
convertObject();
}
private static void convertObject()
{
var rnd = new Random();
var fileContents = new Byte[1024 * 1024 * 10];
rnd.NextBytes(fileContents);
var attachment = new Attachment { Content = fileContents };
Mapper.CreateMap<Attachment, AttachmentDTO>();
Console.WriteLine("Press enter to convert");
Console.ReadLine();
var dto = Mapper.Map<Attachment, AttachmentDTO>(attachment);
Console.WriteLine(dto.Content.Length + " bytes");
Console.ReadLine();
}
}
public class Attachment
{
public byte[] Content { get; set; }
}
public class AttachmentDTO
{
public byte[] Content { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的代码有问题,还是我必须停止对包含二进制数据的对象使用 automapper?
我不确定,但你的原因可能如下:
您的 C# 应用程序在 .NET 运行时上运行,在可能的情况下使用垃圾收集器清除堆内存。
此技术的副作用是使堆内存碎片化。例如,您可能分配了 100MB,其中 40% 可用于新变量,这些新变量被分成最大 5MB 的较小块。
在这种情况下,当您分配一个 10 MB 的新数组时,.NET 虚拟机没有空间来分配它,即使它有 40 MB 的可用空间。
为了解决这个问题,它将可用堆内存增加到 110MB(在最好的情况下),并为新的字节数组分配新的 10MB。
另请参阅: http://msdn.microsoft.com/en-us/magazine/dd882521.aspx#id0400035