就在前一天,我正在调查内存泄漏问题,该问题在不到两分钟的时间内使应用程序从约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/