我正在使用 ANTS 内存分析器来诊断我的 .NET 2.0 应用程序之一中遇到的内存泄漏增加情况。
我在 7.5 小时内拍摄了该过程的 7 个快照,以下是所获得数据的表格表示形式 -
G1代表1代尺寸,G2代表2代尺寸。除了非托管空间和私有字节之外,所有其他值均以 MB 为单位。
我的问题是 -
即使堆大小很小,为什么仍存在如此高的未使用 .NET 空间?
我的大对象堆最大达到约 2 MB,并且在最近 3 个快照期间保持在 96 KB。那么为什么会有如此高的大碎片,它们是否造成了高未使用空间呢?
未管理的空间不断增加。这是否会导致私有字节随着时间的推移而增加?
我对解决这个问题束手无策,并进行了多次分析,但找不到合适的解决方案。我准备提供所需的任何其他数据。
正如 Alex 已经指出的那样,对大对象堆碎片问题类的一个非常好的解释可以在这里找到:
https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/ https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/
该问题在 .NET FX 开发团队中众所周知,并且一直在努力解决。
使用最新的 FX 版本后,这些症状很可能会消失。
从 .NET 4.5.1 开始,将有一个 GC 方法调用来压缩 LOH:http://blogs.msdn.com/b/mariohewardt/archive/2013/06/26/no-more-memory-fragmentation-on-the-large-object-heap.aspx http://blogs.msdn.com/b/mariohewardt/archive/2013/06/26/no-more-memory-fragmentation-on-the-large-object-heap.aspx然而,找到 LOHF 的根本原因比仅仅擦除堆中浪费大量毫秒的效率要高得多
如果您需要有关如何隔离此类影响的更多详细信息,请告诉我。
Seb
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)