我们有WinForm应用程序处理大量的地图数据。我们有一个缓存(一个简单的Hashtable),我们存储经常访问的地图数据,以加快操作。虽然我们确实限制了缓存的大小,但是任务管理器显示了不断增长的内存消耗,最后我们得到了OutOfMemoryException。 奇怪的是内存分析器和GC.GetTotalMemory以及我们自己的对象大小计算都说同样的事情:我们的缓存从不使用比我们的限制集更多的内存。 如果我们禁用缓存,我们的系统工作正常:在处理地图数据期间,它会达到峰值几秒钟,但之后会恢复正常。
内存分析器很好地显示使用的空间(以绿色表示)与我们的缓存大小完全对应,但大部分预留内存未使用。
在分析会话期间,我们拍摄了4个内存快照:
观看下面的颜色编码。为什么那些巨大的未使用空间(蓝色)没有被要求退回? 调用GC.Collect没有区别。
答案 0 :(得分:0)
正如您在图表中看到的,使用的:未使用空间的比率为1:2。修改后 比例是8:1。