第1代堆耗尽记忆作为自由空间

时间:2016-01-07 15:40:54

标签: c# asp.net memory memory-profiling ants

我们的一个产品在生产时消耗了大量内存,因此我们遇到了长期问题。我们经常在服务器上获得低内存警告,最后我终于有机会坐下来使用内存分析器查看内存的位置。在开发中,使用相同的数据库和配置,应用程序的私有工作集为450MB。在生产服务器上,分配给该进程的内存量为3.7GB。

使用Ants Memory Profiler,我确定将2.906GB的内存分配给第1代堆:

Graph

当我们从数据库加载大量数据以生成一些缓存时,会在应用程序启动时利用此内存量。但是,这一切都得到了清理,因为您可以看到上图中的所有数据都已分配但未使用。这是完整的概述:

Memory Summary

正如你所看到的,LOH几乎是空的而且没有碎片化。我知道LOH不会被压缩,除非您专门将CompactOnce设置为适用的GCSettings枚举。但我的印象是,0-2代的人群确实会被压缩并且应该释放免费空间?或者CLR是否只是假设因为大量内存被消耗一次,应用程序应该继续寻找内存以防它需要那么多?

对我来说,我们的应用程序应该只消耗大约600-700MB(其中大部分是CLR)。所以:

  1. 有谁知道为什么这个可用空间仍然只分配在生产服务器而不是开发笔记本电脑上?
  2. 有没有办法从gen 1堆手动释放这个空闲内存?

0 个答案:

没有答案