就在前一天,我正在调查内存泄漏问题,该问题在不到两分钟的时间内使应用程序从约50MB膨胀到了约130MB。原来问题出在ConcurrentQueue类。在内部,该类存储数组的链接列表。当某个项目从ConcurrentQueue中出队时,数组中的索引会增加,但该项目仍保留在数组中(即未设置为null)。在足够的入队/出队后,整个数组节点将被删除,因此从技术上讲这不是泄漏,但是如果将大对象放入ConcurrentQueue中,这可能会很快失控。文档没有记录这种危险。

我想知道基类库中还有哪些其他潜在的内存陷阱?我知道一个子字符串(也就是说,如果您调用子字符串并仅保留结果,则整个字符串仍将保留在内存中)。您遇到过其他人吗?

最佳答案

你是对的。该错误位于System.Collections.Concurrent.ConcurrentQueue<T>+Segment.TryRemove(out T, ref ConcurrentQueue<T>.Segment)方法中。

如果您在Reflector中查看此方法,则会看到以下行:

result = this.m_array[low];

其后应有以下行:
this.m_array[low] = default(T);

作为引用,您可以在System.Collections.Generic.Queue<T>.Dequeue()方法中看到如何正确实现。

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

10-09 10:10