最近我们的.Net core 2.0应用程序中出现了内存峰值问题。当我们分析内存转储时,我们发现大约2GB的可用空间未被释放。
以下是windbg工具的统计数据。
Statistics:
MT Count TotalSize Class Name
000000e32eaf4ca0 15404 2584481422 Free
请告诉我内存未被释放的原因是什么?
答案 0 :(得分:0)
至少出于以下原因:
关于1.),.NET可能会保留从操作系统获取的内存,因为将其返回给操作系统然后从操作系统中回收它会对性能产生影响。如果.NET认为你的程序将在不久的将来请求内存,它可以简单地“缓存”它。
关于2.),这在一个例子中得到了最好的解释。假设您的应用程序请求10 MB。 .NET可能需要从操作系统中获取50 MB的块。然后,应用程序请求1 MB。 .NET将其放入现有的50 MB块中。 10 MB获得释放。但是,.NET无法向操作系统提供49 MB,因为将内存返回给操作系统只能以与给定内存相同的大小完成。
.NET直接在VirtualAlloc()
和VirtualFree()
上运行,因此可能性有限。
如果查看Count
列,您会发现2.5 GB不是连续的。它被分成15000个片段。您的程序可能会受到内存碎片的影响。由于固定句柄和大对象堆上的小对象堆上可能发生内存碎片,因为它不会被压缩。