XmlSerializer在序列化调用时发生内存泄漏

本文关键字:内存 泄漏 序列化 调用 XmlSerializer | 更新日期: 2023-09-27 18:09:23

这是这个问题的后续问题:XmlSerializer extraTypes内存泄漏

我使用了使用外类型重载实现单个静态调用的技术,如下所示:

static readonly XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyDeviceType[]), MyDeviceTypes);

其中MyDeviceTypes看起来像这样:

static readonly Type[] MyDeviceTypes = { typeof(DeviceType1), typeof(DeviceType2) };

我现在看到的问题是,每次调用Serialize:

时,我都会得到内存跳转。
Logger.LogError("SaveDevices: Before Serialize call - " + GetMemoryUsage());
xmlSerializer.Serialize(xwriter, devices); 
Logger.LogError("SaveDevices: After Serialize call - " + GetMemoryUsage());

所以我的日志是这样的:

9/28/2016 5:14:32 PM SaveDevices: Before Serialize call - 344,182,784
9/28/2016 5:14:36 PM SaveDevices: After Serialize call - 359,600,128

和我每次调用Serialize时都看到相同的增长,内存从未被释放,最终导致内存不足错误。

我尝试设置XmlSerialization。在app.config中的编译开关,我没有看到任何源代码,但我确实看到了Microsoft.GeneratedCode.dll和Microsoft.GeneratedCode.pdb文件。当我观察我的应用程序运行时,似乎每次调用Serialize时都会重新生成这个文件。

我如何修改这种行为,使它不会在每次序列化调用时消耗内存并每次重新生成代码?

更新:用简单的测试数据类型替换我的复杂数据类型可以阻止奇怪的行为发生(即没有内存泄漏,也没有Microsoft.GeneratedCode的再生)。在我的复杂数据类型中,是什么导致每次调用Serialize时需要重新生成它?

XmlSerializer在序列化调用时发生内存泄漏

我们能够解决这个问题,方法是在另一个应用程序域中执行需要XmlSerializer的工作,然后将必要的结果传递回调用域,就像这里的回答注释中建议的那样:XmlSerializer extraTypes内存泄漏。这里的AppDomainToolkit: https://github.com/jduv/AppDomainToolkit让事情变得简单多了。