为什么Automapper使用如此多的内存?

时间:2013-06-10 12:51:22

标签: memory-leaks automapper .net-4.5

我正在使用最新版本的Automapper(v3.0.0.0-ci1036),当它使用二进制数据转换对象时,它会使用大量的内存。 (10MB文件为200MB)。这是一个这样的“文件”beging转换的例子:

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; }
}

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

1 个答案:

答案 0 :(得分:0)

我不确定,但您的理由可能如下:

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

此技术具有分割堆内存的副作用。因此,例如,您可能已经分配了100MB,其中40%可用于以最小5MB的较小块分段的新变量。

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

要解决这个问题,它会将可用堆内存提升到110MB(在最好的情况下),并为新的字节数组分配新的10 MB。

另见: http://msdn.microsoft.com/en-us/magazine/dd882521.aspx#id0400035