原始帖子,网址:https://siderite.dev/blog/xmlserializer-memory-leak/
所以我很高兴地关注自己的生产生产发行后,一切都只是为了振作起来!显然,也许是因为我们做的事情,但也许不是因为生产服务器的记忆耗尽。异常看起来像:
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Reflection.Emit.TypeBuilder.SetMethodIL(RuntimeModulemodule, Int32tk ,BooleanisInitLocals, Byte[] body, Int32 bodyLength,
Byte[] LocalSig ,Int32sigLength, Int32maxStackSize, ExceptionHandler[] exceptions, Int32numExceptions ,Int32[] tokenFixups, Int32numTokenFixups)
at System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
at System.Reflection.Emit.TypeBuilder.CreateType()
at System.Xml.Serialization.XmlSerializationReaderILGen.GenerateEnd(String []methods, XmlMapping[] xmlMappings, Type[] types)
at System.Xml.Serialization.TempAssembly.GenerateRefEmitAssembly(XmlMapping []xmlMappings, Type[] types, StringdefaultNamespace ,Evidenceevidence)
at System.Xml.Serialization.TempAssembly..ctor(XmlMapping []xmlMappings, Type[] types, StringdefaultNamespace ,Stringlocation, Evidenceevidence)
at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMappingxmlMapping, Typetype ,StringdefaultNamespace, Stringlocation, Evidence evidence)
at System.Xml.Serialization.XmlSerializer..ctor(Typetype, XmlAttributeOverrides overrides, Type[] extraTypes,
XmlRootAttributeroot, StringdefaultNamespace, Stringlocation, Evidence evidence)
at System.Xml.Serialization.XmlSerializer..ctor(Typetype, XmlAttributeOverrides overrides)
起初,我以为还有其他东西吞噬了记忆,但是在这个特定时刻,例外是反复抛出的。我做了每个高级开发人员所做的事情:搜索了它!我发现this answer:“ 创建XMLSerializer时,将动态生成一个组件并加载到AppDomain中。这些组件才能收集到垃圾,直到其AppDomain被卸载,这在您的情况下永远不会。 ”。它还引用了2007年的Microsoft KB886385
发生了什么事?我会告诉你,但是Gergely Kalapos在他的文章How the evil System.Xml.Serialization.XmlSerializer class can bring down a server with 32Gb ram中解释了更好的解释。他还解释了他用来调试这个问题的命令,这很棒!
但是,由于我们已经知道链接随着时间的流逝而消失(对于互联网上永远存在的东西如此之多),所以这是所有的要旨:
- XmlSerializer在其构造函数中生成动态代码(作为动态组件)
- 班级最常用的构造函数具有缓存机制:
- xmlSerializer.xmlSerializer(type)
- xmlSerializer.xmlSerializer(type,'string)
- 但是the others do not,因此每次使用创建的人之一,加载并且永不卸载 另一个动态组装
我知道这是一个旧框架中的旧课程,但是我们中的一些人仍在扎根于中世纪的公司中工作。同样,由于我打算在线维护博客直到死亡,因此它将在互联网上持续。
希望它有帮助!