用于碎片整理内存的库

时间:2009-12-08 20:50:59

标签: c# asp.net windows memory

有没有人知道对Windows 2003服务器进行碎片整理的dll?

以下是背景资料: 我们有一个.net电子商务网站,它使用预制框架来完成大部分繁重的工作。在将对象添加到缓存时尝试分配内存时,网站偶尔会出现内存不足异常。它主要发生在框架试图将大数据集添加到缓存中时。

据我所知,当你尝试向缓存中添加内容时,需要使用内存来添加对象,如果找不到足够大的内存块,你就会得到一个内存不足的异常。

当IIS消耗600MB以上的内存并且需要10或20 MB以上时,服务器经常遇到此问题。服务器有4GB的内存,所以IIS应该可以使用2GB,但我认为这些大问题找不到合适的地方。所以我的hacky解决方法是尝试捕获异常,运行快速RAM碎片整理并继续。

我知道最好使用较小的对象,但我真的不想对框架进行反向工程以替换部分缓存代码。

干杯, 兰斯

3 个答案:

答案 0 :(得分:2)

首先,内存的物理结构不需要进行碎片整理 - 操作系统管理物理内存页面,并将其作为连续的2GB地址空间呈现给应用程序。然后如何管理这个内存取决于应用程序(或.NET应用程序中的CLR)

大多数CLR中的GC(我相信.NET 4.0 CLR在这方面做了一些更改)对大对象堆使用传统的“链表”分配,并且它不会压缩堆移动大量内存的成本。

这意味着如果您要分配大量不同大小不同生命周期的大型对象,您可以轻松地获得碎片内存和内存不足异常见过。

我从来没有见过内存“碎片整理程序”DLL能够做到这一点你必须完全控制GC和CLR以确保它更新任何引用。

值得尝试的两件事是:

1)如果你可以从缓存中清除对象,那么当你得到一个内存不足异常时会释放一些对象。

2)尝试使用.NET 4.0 CLR来查看是否可以改善这种情况。

答案 1 :(得分:1)

在开始设计解决方案之前,我建议您花一些时间来更好地了解问题。一个很好的起点是CLR profiler。它将让你看到内存分配和垃圾收集器发生了什么。

可能是GC无法跟上内存分配。 GC通常会注意保持内存空间整洁,包括碎片整理。根据您的发现,您可能需要手动trigger the GC

答案 2 :(得分:0)

这篇文章应该包含您需要的一切:

http://msdn.microsoft.com/en-us/magazine/cc163528.aspx 例如:“碎片是否是您管理堆的问题?”