我已经完成了我的 wcf 服务的简单测试 - 不断调用一种方法。然后我分析它的内存使用情况。
内存使用量不断增长。但为什么?
主要内存占用在市场之上。
更新
无法发布商业代码,而且代码太大。但我发现了一件有趣的事。如果我的方法调用发出数据契约解析器的调用,那么内存使用量会不断增长。如果方法调用不发出数据契约(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.之前
2.之后
不是 XmlDictionaryString 的不是 int32[] 的
最佳答案
为了避免内存泄漏,不要使用
XmlDictionary dictionary = new XmlDictionary();
在每个解决调用中
关于.net - 内存泄漏 wcf 与 datacontract 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31408097/