小编Ron*_*dau的帖子

.NET可用内存使用情况(如何防止OS的内存/释放内存)

我目前正在开发一个大量使用缓存数据的网站,以避免往返.在启动时,我们得到一个"大"图(数百个不同类型的对象).这些对象通过WCF检索并反序列化(我们使用协议缓冲区进行序列化)我正在使用redgate的内存分析器来调试内存问题(在我们完成之后,内存似乎与我们应该需要的内存不相符"初始化并以此报告结束

全球报告

现在我们可以从这份报告中得到的结论是:

1)分配的大部分内存是免费的(它可能在反序列化期间被正确分配,但现在它是免费的,我希望它能够返回到操作系统)

2)内存碎片化(这很糟糕,因为每当我刷新现金时我需要重做内存饥饿的反序列化过程,这反过来会创建大对象,由于碎片而可能抛出OutOfMemoryException)

3)我不知道为什么空间是碎片的,因为当我看到大对象堆时,只有30个实例,15个object []直接连接到GC并且与我完全无关,1也是char数组直接附加到GC堆,其余15个是我的,但不是原因,因为如果我在代码中注释掉它,我得到相同的报告.

所以我的问题是,我该怎么做才能更进一步呢?我不太确定在调试/工具中要找什么,因为看起来我的内存是碎片化的,但不是我,并且.net分配了大量的可用空间,我无法释放.

另外请确保你在回答之前理解这个问题,我不是在寻找一种方法来释放.net(GC.Collect)中的内存,而是释放已经在.net中释放的内存,以及系统以及对记忆进行碎片整理.

请注意,缓慢的解决方案很好,如果可以手动对大堆进行碎片整理,那么我可以在RefreshCache的末尾调用它,如果运行需要1或2秒,则可以.

谢谢你的帮助!

我忘记了一些注意事项:1)该项目是.net 2.0网站,我在.net 4池中运行相同的结果,如果我在.net 4池中运行它并将其转换为.net 4和重新编译.

2)这些是发布版本的结果,因此调试版本不是问题.

3)这可能非常重要,我在webdev服务器上根本没有得到这些问题,只在IIS中,在webdev中,我的内存消耗量与我的实际消耗量相当接近(更多,但不是5-10倍! )

.net c# clr garbage-collection memory-management

17
推荐指数
2
解决办法
6711
查看次数

标签 统计

.net ×1

c# ×1

clr ×1

garbage-collection ×1

memory-management ×1