XmlSerializer的extraTypes内存泄漏 [英] XmlSerializer extraTypes memory leak

查看:217
本文介绍了XmlSerializer的extraTypes内存泄漏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发某些应用,调用至极XmlSerializer的很多构造与extraTypes parametr的。我已经找到答案,即约100KB和2描述符(有时更多)每次调用encrease应用程序内存。
码例如:

I'm developing some application, wich calls lot of XmlSerializer constructor with extraTypes parametr. I've find out, that each call encrease application memory for about 100KB and 2 descriptors (sometimes more). Code example:

有关100KB的代码encrease应用程序的内存和每个每次通话2处理器

this code encrease application memory for 100KB and 2 handlers per each call

while (true)
            {
                Console.ReadLine();
                new XmlSerializer(typeof (object), new Type[] {});
            }

这代码encrease应用程序内存为43024KB和2004处理器

this code encrease application memory for 43024KB and 2004 handlers

 for (var i = 0; i < 1000; i++)
            {
                new XmlSerializer(typeof (object), new Type[] {});
            }



所以控制台应用程序只是siplest例如:

so just siplest example of console application:

internal class Program
    {
        private static void Main(string[] args)
        {
            //this code encrease application memory for 43024KB and 2004 handlers
            for (var i = 0; i < 1000; i++)
            {
                new XmlSerializer(typeof (object), new Type[] {});
            }
            Console.WriteLine("Finished. Press any key to continue...");


            Console.ReadLine();
        }
    }



是它的XmlSerializer或做错事的错误IM ?

Is it a bug in XmlSerializer or im doing something wrong?

诗同时对优化代码和发布版本

P.s. same with optimize code on and Release build

推荐答案

好吧,已经有MSDN上的 https://开头的博客。 msdn.microsoft.com/tess/2006/02/15/net-memory-leak-xmlserializing-your-way-to-a-memory-leak/

Ok, there is already an answer on msdn https://blogs.msdn.microsoft.com/tess/2006/02/15/net-memory-leak-xmlserializing-your-way-to-a-memory-leak/

拍摄的回答是:不,这是不是一个错误,这是一个特征;)

Shot answer is: no, it is not a bug, it is a feature ;)

XmlSerializer的创建与每extraTypes parametr构造每次调用一个TempAssembly。而组装不上GC堆对象,GC真的是不知道的组件,因此它不会收集垃圾

XmlSerializer creates a TempAssembly per each call of constructor with extraTypes parametr. And "an assembly is not an object on the GC Heap, the GC is really unaware of assemblies, so it won’t get garbage collected"

解决方案是缓存的XmlSerializer的在一些字典,并且只使用一个对象每个类型,而不是创造新的XmlSerializer每次u需要它

Solution is to cache XmlSerializer's in some dictionary and use only one object per type instead of creating new XmlSerializer each time u need it

这篇关于XmlSerializer的extraTypes内存泄漏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆