在.net core 2.0 linux上使用XmlSerializer发生内存泄漏

在.net core 2.0 linux上使用XmlSerializer发生内存泄漏,linux,memory-leaks,.net-core,xml-serialization,Linux,Memory Leaks,.net Core,Xml Serialization,经过大量的研究和试验,我们发现了一个错误。我终于找到了我的内存泄漏的来源。您需要将XmlSerializer用作静态对象 私有字符串序列化(Bob请求) { XmlSerializer xSer=CreateOverrider(request.Token.Value.Trim().Length

经过大量的研究和试验,我们发现了一个错误。我终于找到了我的内存泄漏的来源。您需要将XmlSerializer用作静态对象

私有字符串序列化(Bob请求)
{
XmlSerializer xSer=CreateOverrider(request.Token.Value.Trim().Length<1?true:false);
XmlSerializerNamespaces xmlnsEmpty=新的XmlSerializerNamespaces();
xmlnsEmpty.Add(string.Empty,“http://www.schema.com/schema");
StringBuilder sb=新的StringBuilder();
使用(XmlWriter=XmlWriter.Create(sb,newxmlwritersettings(){omitxmlsdeclaration=true}))
{
序列化(writer、request、xmlnsEmpty);
}
使某人返回字符串();
}
// https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributes.xmlignore(v=vs.110).aspx
私有XmlSerializer CreateOverrider(布尔重写)
{
//创建XmlAttributeOverrides和XmlAttributes对象。
xOver=新的XmlAttributeOverrides();
XmlAttributes attrs=新的XmlAttributes();
attrs=新的XmlAttributes();
attrs.XmlIgnore=覆盖;
Add(新的XmlElementAttribute(“验证”);
添加(typeof(RegisterBobRequest),“validation”,attrs);
XmlSerializer xSer=新的XmlSerializer(typeof(BobRequest),xOver);
返回xSer;
}
上面的代码导致了缓慢的内存泄漏,在windows上也不是问题。一旦发布到.NETCore2.0上的Ubuntu16.04,内存大约每分钟会增加1mg。最终的结果是使“XmlSerializer”成为静态和只读的

    private static readonly XmlSerializer xmlSerializer = CreateOverrider(false);
    private static readonly XmlSerializer xmlSerializerTrue = CreateOverrider(true);

    private string Serialize(Bob request)
    {
        XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces();
        xmlnsEmpty.Add(string.Empty, "http://www.schema.com/schema");

        StringBuilder sb = new StringBuilder();
        using (XmlWriter writer = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true }))
        {
            if (request.Token.Value.Trim().Length < 1)
            {
                xmlSerializerTrue.Serialize(writer, request, xmlnsEmpty);
            }
            else
            {
                xmlSerializer.Serialize(writer, request, xmlnsEmpty);
            }
        }

        return sb.ToString();
    }
私有静态只读XmlSerializer XmlSerializer=CreateOverrider(false);
私有静态只读XmlSerializer xmlSerializerTrue=CreateOverrider(true);
私有字符串序列化(Bob请求)
{
XmlSerializerNamespaces xmlnsEmpty=新的XmlSerializerNamespaces();
xmlnsEmpty.Add(string.Empty,“http://www.schema.com/schema");
StringBuilder sb=新的StringBuilder();
使用(XmlWriter=XmlWriter.Create(sb,newxmlwritersettings(){omitxmlsdeclaration=true}))
{
if(request.Token.Value.Trim().Length<1)
{
serializerTrue.Serialize(writer、request、xmlnsEmpty);
}
其他的
{
serializer.Serialize(writer、request、xmlnsEmpty);
}
}
使某人返回字符串();
}
在一天结束时,当内存泄漏时,服务器将运行到8gig限制,并且需要回收服务。此更新后,进程一直在~330meg的速度下运行,没有问题


现在,我们每天通过这项服务推送大约10万个请求,没有问题。我希望这对其他人有所帮助。

如果这是一个合法问题,我会将其登录到.NET核心API GitHub repo()上,而不是在这里创建一个问题(实际上不提供问题)。那边的人总是欢迎bug和反馈。不过,我会先看看一些已解决的问题。您在这里提供了很多信息,但他们可能需要更多细节以便进行调试。
    private static readonly XmlSerializer xmlSerializer = CreateOverrider(false);
    private static readonly XmlSerializer xmlSerializerTrue = CreateOverrider(true);

    private string Serialize(Bob request)
    {
        XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces();
        xmlnsEmpty.Add(string.Empty, "http://www.schema.com/schema");

        StringBuilder sb = new StringBuilder();
        using (XmlWriter writer = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true }))
        {
            if (request.Token.Value.Trim().Length < 1)
            {
                xmlSerializerTrue.Serialize(writer, request, xmlnsEmpty);
            }
            else
            {
                xmlSerializer.Serialize(writer, request, xmlnsEmpty);
            }
        }

        return sb.ToString();
    }