【发布时间】:2015-03-04 19:03:01
【问题描述】:
当我使用该方法反序列化字典时,我有内存泄漏。这里通过下面的测试来重现问题。
public static Dictionary<TKey, TValue> DeserializeDictionary<TKey, TValue>(this string iSerialization)
{
Dictionary<TKey, TValue> dic;
using (var textWriter = new StringReader(iSerialization))
{
XmlSerializer serializer = new XmlSerializer(typeof(Item<TKey, TValue>[]), new XmlRootAttribute() { ElementName = "items" });
dic = ((Item<TKey, TValue>[])serializer.Deserialize(textWriter)).ToDictionary(i => i.Key, i => i.Value);
textWriter.Close();
}
return dic;
}
public class Item<TKey, TValue>
{
[XmlAttribute]
public TKey Key;
[XmlAttribute]
public TValue Value;
}
测试:
[TestMethod]
public void test()
{
string test = "<?xml version=\"1.0\" encoding=\"utf-16\"?><items xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><ItemOfStringString Key=\"mykey\" Value=\"myvalue\" /></items>";
while(true)
{
Dictionary<string, string> tesfezf = test.DeserializeDictionary<string, string>();
}
}
你知道问题出在哪里吗?
编辑:我在一个workerazure角色中使用这个方法,在一个循环中(大约20000),这会填充内存并抛出内存不足异常。
【问题讨论】:
-
您有什么证据表明存在内存泄漏?
-
您的测试中没有断言,能否详细说明您断言的问题是什么?
-
在这种情况下,预计内存使用量会增加,您正在反序列化数据。 CLR 将执行所需的工作,并分配实现它所需的内存。
-
@Julian50 代码使用内存的事实并不意味着它正在泄漏内存。这只是意味着它正在使用大量内存。
-
预编译或至少缓存的序列化程序应该解决多个动态编译程序集消耗所有内存的问题...stackoverflow.com/questions/678676/…
标签: c# .net dictionary memory-leaks garbage-collection