.net - 内存泄漏 wcf 与 datacontract 解析器

标签 .net wcf memory-leaks

我已经完成了我的 wcf 服务的简单测试 - 不断调用一种方法。然后我分析它的内存使用情况。

enter image description here

内存使用量不断增长。但为什么?

enter image description here

主要内存占用在市场之上。

更新

无法发布商业代码,而且代码太大。但我发现了一件有趣的事。如果我的方法调用发出数据契约解析器的调用,那么内存使用量会不断增长。如果方法调用不发出数据契约(Contract)解析器的调用,则内存使用量不会增加。

我的数据契约(Contract)解析器如下所示:

public class MyResolver : DataContractResolver
{
    public override bool TryResolveType(Type dataContractType, Type declaredType, DataContractResolver knownTypeResolver, 
        out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
    {

        if (dataContractType == typeof(MyDerivedType))
        {
            XmlDictionary dictionary = new XmlDictionary();
            typeName = dictionary.Add("MyDerivedType");
            typeNamespace = dictionary.Add("http://tempuri.com");
            return true;
        }
        else
        {
            return knownTypeResolver.TryResolveType(dataContractType, declaredType, null, out typeName, out typeNamespace);
        }
    }
    ...
}

怎么了?

更新 2

我已经完成了简单的解决方法:

 public class MyResolver : DataContractResolver
{
    private static  Dictionary<string,XmlDictionary> _typesCache=new Dictionary<string, XmlDictionary>();
    static MyResolver()
    {
         XmlDictionary myDerivedTypeDictionary = new XmlDictionary();
         myDerivedTypeDictionary.Add("MyDerivedType");
         myDerivedTypeDictionary.Add("http://tempuri.com");
         _typesCache["MyDerivedType"] = myDerivedTypeDictionary ;
    }
     public override bool TryResolveType(Type dataContractType, Type declaredType, DataContractResolver knownTypeResolver, 
        out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
    {
       if (dataContractType == typeof(MyDerivedType))
        {
            XmlDictionary dictionary = _typesCache["MyDerivedType"];
            XmlDictionaryString typeNameDictionaryString;
            dictionary.TryLookup("MyDerivedType", out typeNameDictionaryString);
            XmlDictionaryString namespaceDictionaryString;
            dictionary.TryLookup("http://tempuri.com", out namespaceDictionaryString);
            typeName = typeNameDictionaryString;
            typeNamespace = namespaceDictionaryString;

            return true;
        }
        ...
     }
     ...
}

看看区别:

1.之前

enter image description here

2.之后

enter image description here

不是 XmlDictionaryString 的不是 int32[] 的

最佳答案

为了避免内存泄漏,不要使用

XmlDictionary dictionary = new XmlDictionary();

在每个解决调用中

关于.net - 内存泄漏 wcf 与 datacontract 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31408097/

相关文章:

c# - C# for WinForms 中动态变量名称的使用

c# - .NET:为什么 TryParseExact 在 Hmm 和 Hmmss 上失败?

c# - Datatable.WriteXml-如何在元素名称中保留空格

c# - BasicHttpBinding 和 MessageVersion.None

c# - 读取 PDF 文件并作为流从 WCF 服务返回?

c# - 这不是冗余代码有什么理由吗?

wcf - 角色运行的计算机是否相同?

python - 当 DEBUG 为 False 时,使用 Django 的(非网络)脚本是否需要 django.db.reset_queries?

java - Java内存分析工具和内存泄漏检测工具有什么区别?

java - 处理程序内存泄漏?