ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

c# – XmlSerializer extraTypes内存泄漏

2019-06-23 05:52:20  阅读:265  来源: 互联网

标签:c net memory-leaks xmlserializer


我正在开发一些应用程序,它使用extraTypes参数调用许多XmlSerializer构造函数.我发现,每次调用都会增加大约100KB的应用程序内存和2个描述符(有时更多).
代码示例:

此代码增加了每个调用100KB和2个处理程序的应用程序内存

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

此代码增加了43024KB和2004处理程序的应用程序内存

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

所以只是最简单的控制台应用示例:

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中的错误还是我做错了什么?

附:与优化代码和发布版本相同

解决方法:

好的,msdn https://blogs.msdn.microsoft.com/tess/2006/02/15/net-memory-leak-xmlserializing-your-way-to-a-memory-leak/上已有答案

拍摄答案是:不,它不是一个bug,它是一个功能;)

每次使用extraTypes parametr调用构造函数时,XmlSerializer都会创建一个TempAssembly.并且“程序集不是GC堆上的对象,GC实际上并不知道程序集,因此不会收集垃圾”

解决方案是将XmlSerializer缓存在某些字典中,每个类型只使用一个对象,而不是每次需要时都创建新的XmlSerializer

标签:c,net,memory-leaks,xmlserializer
来源: https://codeday.me/bug/20190623/1267998.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有