我正在开发一些应用程序,它使用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中的错误还是我做错了什么?
P.S。与优化代码和发布版本相同
答案 0 :(得分:4)
拍摄答案是:不,它不是错误,它是一个特征;)
XmlSerializer每次使用extraTypes parametr调用构造函数时都会创建一个TempAssembly。并且“程序集不是GC堆上的对象,GC实际上并不知道程序集,因此不会收集垃圾”
解决方法是将XmlSerializer缓存在某些字典中,每种类型只使用一个对象,而不是每次需要时都创建新的XmlSerializer