C#中XmlSerializer的内存占用问题
被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的内存占用问题的更多相关文章
- [转帖]Linux中buff/cache内存占用过高解决办法
Linux中buff/cache内存占用过高解决办法 https://www.cnblogs.com/rocky-AGE-24/p/7629500.html /proc/sys/vm/drop_cac ...
- 项目中Map端内存占用的分析
最近在项目中开展重构活动,对Map端内存尽量要省一些,当前的系统中Map端内存最高占用大概3G左右(设置成2G时会导致Java Heap OOM).虽然个人觉得占用不算多,但是显然这样的结果想要试 ...
- 优化 UWP 中图片的内存占用
跟图片打交道的 UWP 应用或多或少都会遇到图片带来的性能问题,就算不主要处理图片,做个论坛做个新闻客户端都涉及到大量图片.一个帖子.一篇文章里多半都是些高清大图,这些图片一张即可占用程序 1~2M ...
- Linux 中 Buffer/Cache内存占用过高解决方法
在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: 这里的默认显示单位是kb,我的服务器是128G内存,所以数字显 ...
- Linux中buff/cache内存占用过高解决办法
在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个centos7的系统上,free命令的显示内容大概是这样一个状态: 这个命令几乎是每一个使用过Linux的人必会的命令,但越是 ...
- 关于Android中图片大小、内存占用与drawable文件夹关系的研究与分析
原文:关于Android中图片大小.内存占用与drawable文件夹关系的研究与分析 相关: Android drawable微技巧,你所不知道的drawable的那些细节 经常会有朋友问我这个问题: ...
- [转]Android中内存占用的含义:(VSS,PSS,RSS,USS)
Android中内存占用的含义:(VSS,PSS,RSS,USS) 作者: andforce 分类: 安卓系统 发布时间: 2013-09-07 00:03 ė1,915 浏览数 6没有评论 在eng ...
- 在linux下,查看一个运行中的程序, 占用了多少内存
1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中 VSZ(或VSS)列 表示,程序占用了多少虚拟内存. RSS列 表示, 程序占用了多少物 ...
- cloudsim仿真过程中内存占用过大问题的解决
在写<云环境下基于预算和截止期约束的科学工作流弹性资源提供和调度>这篇文章时用到了cloudsim仿真软件进行实验仿真,在实验过程中遇到了当仿真执行时间过长时程序总是不能正常结束,由于仿真 ...
随机推荐
- 探讨 : Host在IIS上的WCF Service的执行方式
一个WCF请求由两个线程来完成 运行在IIS上的WCF service, 你可能会注意到一个比较有趣的现象. 当WCF service接收到一个请求时, 这个请求实际上会有两个线程在执行这个请求. 一 ...
- C#山寨版本拨号客户端
C#山寨版本[天翼拨号客户端]---内含详细抓包,模拟数据---万事俱备,只欠东风. 本帖子本来最初是发在CSDN上的,回复的也有十几个,但没有一个有技术含量的回复....特来此讨论,请教,请各位 ...
- 数据访问模式之Repository模式
数据访问模式之Repository模式 数据访问层无非就是对数据进行增删改查,其中增.删.改等我们可以抽象出来写一个公共的接口或抽象类来定义这些方法,并采用一个基类实现这些方法,这样该基类派生的子 ...
- IO多路复用之select
IO多路复用之select总结 1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交 ...
- Ogre源码编译教程
最近突然发现Ogre引擎更新到2.1版本了,既然依旧是代码开源,本着学习的精神就下载下来弄弄.但是官网提供的SDK版本只有1.9的,考虑到学习的便利性,因此最好从Source版本开始弄,这样的话以后想 ...
- MessageBox, MessageBoxBurttons, MessageBoxIcon 详细解析
[函数]:<整型> MessageBox(<字符串 Text, <字符串> Title, <整型> MessageBoxBurttons,MessageBox ...
- TOGAF架构内容框架之架构制品(上)
TOGAF架构内容框架之架构制品(上) 4. 架构制品(Architectural Artifacts) 架构制品是针对某个系统或解决方案的模型描述,与架构交付物和构建块相比,架构制品既不是架构开发方 ...
- dede搜索引擎
1.dede模板中的html: <form action="{dede:fieldname='phpurl'/}/search.php" name="formsea ...
- CSS之纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等)
图形包括基本的矩形.圆形.椭圆.三角形.多边形,也包括稍微复杂一点的爱心.钻石.阴阳八卦等.当然有一些需要用到CSS3的属性,所以在你打开这篇文章的时候,我希望你用的是firefox或者chrome, ...
- 使用prismjs为网站添加代码高亮功能
prismjs 是一款轻量.可扩展的代码语法高亮库,使用现代化的 Web 标准构建,使用 Prismjs 可以快速为网站添加代码高亮功能,支持超过113中编程语言,还支持多种插件,是简洁.高效的代码高 ...