gpt4 book ai didi

c# - 内存流泄漏

转载 作者:太空狗 更新时间:2023-10-29 20:10:47 25 4
gpt4 key购买 nike

谁能告诉我们下面这段代码有什么问题?我们这里有一个对象序列化程序,它应该返回传递给它的任何对象的 XML 字符串。

我们一直在为这个问题绞尽脑汁,因为我们有一个多次调用它的程序,我们看到我们的内存使用率飙升(甚至在程序完成后仍保持在那里)..我们已经完成了搜索但无济于事。流对象在“using”语句中,所以我们认为它应该自行处理。请帮忙。

    public static string ToXML(this IMessage m)
{
try
{
var serializer = SerializerFactory.Create(m.GetType());
using (var stream = new MemoryStream())
{
serializer.Serialize(new[] { m }, stream);
stream.Position = 0;
var s = Encoding.ASCII.GetString(stream.ToArray());
return s;
}
}
catch (Exception e)
{
return string.Format("Message unserializable: {0}", e.Message);
}
}

顺便说一句,SerializerFactory 看起来像这样:

public class SerializerFactory
{
public static IMessageSerializer Create(Type t)
{
var types = new List<Type> { t };
var mapper = new MessageMapper();
mapper.Initialize(types);
var serializer = new XmlMessageSerializer(mapper);

serializer.Initialize(types);

return serializer;
}
}

最佳答案

这段代码没有什么非常的错误;请注意,using 本质上 MemoryStream 上的空操作,因为它只有托管资源,并且托管资源是 GC 的领域; GC 在有意义 收集一些内存之前不会过分担心是正常的,所以我不会强调太多 - 或者:如果有问题,可能不是这个问题。

不过,一个观察结果是您可以避免在编码步骤中使用缓冲区:

var s = Encoding.ASCII.GetString(stream.GetBuffer(), 0, (int)stream.Length);

实际上,我很想默认使用 UTF8,而不是 ASCII。

最后一个想法:您的 SerializerFactory 本身 是否正在做一些泄漏的事情?例如,您是否通过任何更复杂 构造函数创建了一个new XmlSerializer(...)?最简单的形式:

new XmlSerializer(typeof(SomeType));

很好 - 它在内部缓存每个类型的内部/实际序列化程序,并为创建它的每个 XmlSerializer 实例重新使用它方法。但是,它不会为更复杂的构造函数重载执行此缓存:它每次都会创建并加载一个新的动态程序集。以这种方式加载的程序集永远不会卸载 - 所以是的,可能会导致内存泄漏。我非常想知道序列化程序实例是如何创建的,看看 that 是否是实际问题。请注意,通过在工厂中创建您自己的序列化器缓存,通常很容易解决此类情况:

public class SerializerFactory
{
// hashtable has better threading semantics than dictionary, honest!
private static readonly Hashtable cache = new Hashtable();
public static IMessageSerializer Create(Type t)
{
var found = (IMessageSerializer)cache[t];
if(found != null) return found;

lock(cache)
{ // double-checked
found = (IMessageSerializer)cache[t];
if(found != null) return found;

var types = new List<Type> { t };
var mapper = new MessageMapper();
mapper.Initialize(types);
var serializer = new XmlMessageSerializer(mapper);

serializer.Initialize(types);

cache[t] = serializer;

return serializer;
}
}
}

关于c# - 内存流泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12312961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com