被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. 竞价广告系统-ZooKeeper介绍

    ZooKeeper介绍 为了讲述的完整性,介绍一下ZooKeeper.ZooKeeper在Index和Ad Server里使用比较多,虽然它可能没有google的Chubby好,但它是开源的工具.举一 ...

  2. iOS 开发之Target-action模式

    Target-action:目标-动作模式,它贯穿于iOS开发始终.但是对于初学者来说,还是被这种模式搞得一头雾水. 其实Target-action模式很简单,就是当某个事件发生时,调用那个对象中的那 ...

  3. 模块化与MVC

    [javascript激增的思考02]模块化与MVC 前言 之前我们遇到了这么一个项目,也就是我们昨天提到的,有很多的小窗口的,昨天说的太抽象了,今天我们再来理一理什么是小窗口(后面点说下),当时由于 ...

  4. MapXtrem + Asp.net 地图随窗体改变大小

    在B/S框架下,MapXtreme都是基于图片的,也就是说在客户端显示的地图实际上都是一张图片. 地图控件 <cc1:MapControl ID="/> 在调试模式下,编译后的地 ...

  5. Class.forName不能加载abstract原因

    今天看到单例模式时,突然想起,单例模式的情况是不让其他类来构造这个类本身,也就是不让new构造器,所以我们一般都会私有化这个构造器.我们知道abstract类是不能实例化的,我想利用abstract这 ...

  6. poj1463 Strategic game (树状dp)

    Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 5498   Accepted: 2484 De ...

  7. 横瓜先生关于如何利用MYSQL数据库设计CMS系统处理100亿级TB规模的数据量

    遥执乾坤(44758121)  18:21:23 mysql据说只能使用一个索引,我这里几乎所有字段都有索引. 但每个字段就算用索引,也需要扫描至少100w以上记录. 横瓜(601069289)  1 ...

  8. centos设置服务开机自启动

    在CentOS或者RedHat其他系统下,如果是后面安装的服务,如httpd.mysqld.postfix等,安装后系统默认不会自动启动的.就算手动执行/etc/init.d/mysqld start ...

  9. C++虚函数实现多态原理(转载)

    一.前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有"多种形态 ...

  10. Netty 5.0源码分析之综述

    1. 前言 本系列主要是用于梳理Netty的架构流程,深入设计细节,重点关注Netty是如何实现它所声称的特性. (ps:本人水平有限,如有错误,请不吝指教 : )) 2. 什么是Netty Nett ...