被XmlSerializer掉坑里了,爬了一晚上才出来。

本来实现一个功能,从数据库中查出一堆数据(比较多,几十万,不过,是分批查出来的),查出来的数据包含了一个XML字符串,代码中对其进行序列化,一开始的代码是这样写的:

            string xmlString = "<root>" +
"<Employee><Name>张三</Name><Age>20</Age><Address>深圳南山</Address></Employee>" +
"<Employee><Name>李四</Name><Age>22</Age><Address>深圳南山</Address></Employee>" +
"</root>";
//string xmlString2 = "<Employee><Name>张三</Name><Age>20</Age><Address>深圳南山</Address></Employee>"; for (var i = 0; i < 100000; i++)
{
byte[] bytes = System.Text.Encoding.GetEncoding("utf-8").GetBytes(xmlString);
using (var stream = new MemoryStream(bytes))
{
try
{
XmlSerializer xz1 = new XmlSerializer(typeof(Employee), new XmlRootAttribute("root"));
//XmlSerializer xz1 = new XmlSerializer(typeof(Employee));
var r = (Employee)xz1.Deserialize(stream);
}
finally
{
stream.Close();
stream.Dispose();
}
}
Console.WriteLine(i);
}
Console.Read();

  看起来没什么问题,不过,一到正式环境运行了几次这个几十万就完蛋了,内存直线上升,我在本地模拟了一下(就是上面的代码撒),这么一段小小的反序列化,一会进程就占用了近1G的空间,并且代码跑完也不会自动回收,测试使用GC进行回收,也没有用。后来在微软的官网找到帮助文档(https://support.microsoft.com/en-us/kb/886385)

在打开某度翻译的前提下,把这篇文章看懂了,大概意思是:

现象:当创建一些XmlSerializer对象时,内存会异常增加。

引起的原因:当创建这个对象时,会动态的加载一些程序集,但是我们又不可以手动销毁这些程序集,就会导致在创建N多个XmlSerializer时,内存会占用很多。

解决办法:

1、使用缓存,即把每次创建的XmlSerializer对象使用某种方式(Cache,或者Static)进行缓存,下次就不再创建了。

2、使用如下的构造函数:

public XmlSerializer(Type type);
public XmlSerializer(Type type, string defaultNamespace);

例如上面的代码中注释掉的部分,就是使用第一个构造函数。使用这种方式,这个小Demo中,内存也只占用10M左右。并且执行速度也比原来的快很多。

总觉得这个功能太坑了,看了一下系统中的代码,包含原来的老代码,都是存在内存的问题,不过,原来没有集中声明对象的场景,所以没有出现,偶尔出来服务挂了,也不知道什么 原因,反正系统又自动重启了,就遗留观察吧,然后就一直观察下去,没下文了。。。

C#中XmlSerializer的内存占用问题的更多相关文章

  1. [转帖]Linux中buff/cache内存占用过高解决办法

    Linux中buff/cache内存占用过高解决办法 https://www.cnblogs.com/rocky-AGE-24/p/7629500.html /proc/sys/vm/drop_cac ...

  2. 项目中Map端内存占用的分析

      最近在项目中开展重构活动,对Map端内存尽量要省一些,当前的系统中Map端内存最高占用大概3G左右(设置成2G时会导致Java Heap OOM).虽然个人觉得占用不算多,但是显然这样的结果想要试 ...

  3. 优化 UWP 中图片的内存占用

    跟图片打交道的 UWP 应用或多或少都会遇到图片带来的性能问题,就算不主要处理图片,做个论坛做个新闻客户端都涉及到大量图片.一个帖子.一篇文章里多半都是些高清大图,这些图片一张即可占用程序 1~2M ...

  4. Linux 中 Buffer/Cache内存占用过高解决方法

    在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: 这里的默认显示单位是kb,我的服务器是128G内存,所以数字显 ...

  5. Linux中buff/cache内存占用过高解决办法

    在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个centos7的系统上,free命令的显示内容大概是这样一个状态: 这个命令几乎是每一个使用过Linux的人必会的命令,但越是 ...

  6. 关于Android中图片大小、内存占用与drawable文件夹关系的研究与分析

    原文:关于Android中图片大小.内存占用与drawable文件夹关系的研究与分析 相关: Android drawable微技巧,你所不知道的drawable的那些细节 经常会有朋友问我这个问题: ...

  7. [转]Android中内存占用的含义:(VSS,PSS,RSS,USS)

    Android中内存占用的含义:(VSS,PSS,RSS,USS) 作者: andforce 分类: 安卓系统 发布时间: 2013-09-07 00:03 ė1,915 浏览数 6没有评论 在eng ...

  8. 在linux下,查看一个运行中的程序, 占用了多少内存

    1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中  VSZ(或VSS)列 表示,程序占用了多少虚拟内存. RSS列 表示, 程序占用了多少物 ...

  9. cloudsim仿真过程中内存占用过大问题的解决

    在写<云环境下基于预算和截止期约束的科学工作流弹性资源提供和调度>这篇文章时用到了cloudsim仿真软件进行实验仿真,在实验过程中遇到了当仿真执行时间过长时程序总是不能正常结束,由于仿真 ...

随机推荐

  1. 一个吊丝android个人开发者的逆袭之路

    转眼间,一年多过去了,记得我开发第一款android应用的时候,那是在前年的冬天,我本人是做java的,android的学习和开发完全是业余爱好,从前年上半年到前年下半年大约花了半年的业余时间把and ...

  2. 将SQL获取的信息传递到Email中

    将SQL获取的信息传递到Email中 最近在为公司财务开发一个邮件通知时遇到了一个技术问题.原来我设计SSIS的是每天将ERP系统支付数据导出到财务支付平台后 Email 通知财务,然后财务到支付平台 ...

  3. c# datagridview 设置某行不可见解决办法

    [前提]datagridview与数据库绑定,需要单独设置某行或者某个单元格不可见. [问题分析]直接用this.dataGridCiew1.Rows[0].Visible = false;不可行,会 ...

  4. Dalvik虚拟机的垃圾收集机制

    垃圾收集机制是Java虚拟机共有的特性, 这里介绍Dalvik虚拟机的垃圾收集机制特点. 在android2.3之前,有以下几个特点: 1.  垃圾收集线程在执行的时候,其它线程都停止. 2.  一次 ...

  5. Solr之NamedList 简单介绍与实例解析

    大家都知道,Solr是一个基于Lucene高可配置的搜索服务器,大部分参数值以及相关优化等等都可以在solrconfig.xml中配置,那么就需要一个能够很快的进行解析和读取配置文件内容的数据结构,为 ...

  6. Ubuntu 创建启动器

    首先我们要了解,Ubuntu 的 Dash 里所有程序都是在 /usr/share/applications 中的,所以我们的思路很简单——建一个类似于“快捷方式”一样的东西扔进去就好了.所以第一步自 ...

  7. 使用 IDEA 创建 Maven Web 项目 (二)- 搭建 WEB 项目框架

    转为 Java Web 项目 将上一节中创建的 Maven 项目调整为 WEB 项目结构,步骤如下: 在 main 目录下,添加 webapp 目录. 在 webapp 目录下,添加 WEB-INF ...

  8. 2016年美国数学建模比赛(MCM/ICM) E题环境科学 Are we heading towards a thirsty planet? 人工精准翻译。

    第二次参加建模,觉得建模太有趣了,用几天的时间,迅速学习新知识,并解决实际问题. ——————————————————————————————————————————————————————————— ...

  9. Android中使用开源框架Fresco处理图片

    本文为原创博文,转载请注明原文链接:http://www.cnblogs.com/panhouye/p/6278116.html 关于Fresco的优点大家自行谷歌吧,它太强大太优秀了,我这一片小博文 ...

  10. ESLint--定制你的代码规则

    简介 ESLint是一个开源的项目,由Nicholas C. Zakas(<JavaScript高级程序设计>作者)于2013年六月创建.它的目标是为JavaScript提供一个完全可配置 ...