使内存密集的后台应用程序“友好”

我有一个应用程序,需要定期处理大块的数据与一个计算平凡的algorithm。 事实certificate,我也可以通过将数据块保存在内存caching中来防止系统从硬盘访问中放慢速度。 该应用程序是一个低优先级的应用程序,所以我正在尽量减less它对整个系统的影响,这意味着使用额外的内存(可用时)来减lessCPU和硬盘驱动器的负载。 高速caching的数据只有64MB字节块,我在内存中的数据越多,程序在驱动器上的开销就越小。

我需要做的就是转储内存caching,只要系统上的其他应用程序需要比可用内存更多的物理内存,并且这样做的速度足够快,以至于用户从不觉得系统由于高内存需求而变慢。

我特别感兴趣的是如何在.NET应用程序中完成这项工作。

Solutions Collecting From Web of "使内存密集的后台应用程序“友好”"

一种选择是使用ASP.NET缓存,该缓存响应内存不足而清理项目。 虽然微软提出了一个很大的警告,那就是只能在ASP.NET应用程序中进行测试,但是在任何应用程序中都无法阻止您访问HttpRuntime.Cache ,并且在实践中它已经工作了。

如果这感觉肮脏和错误(或只是没有做你需要的东西),我们至少可以从ASP.NET如何清除缓存中获得灵感。 它周期性地调用内核的GlobalMemoryStatusEx来找出可用的内存。 具体而言,返回结构的dwMemoryLoad属性是正在使用的总内存的百分比。 默认情况下,ASP.NET会在内存达到90%时认为内存不足。

这里有一些示例代码可以自己调用它。

您可以使用LowMemoryResourceNotification选项向/从Win32 CreateMemoryResourceNotification API调用。 这将返回一个通知对象,您可以轮询(使用QueryMemoryResourceNotification)或等待(在后台线程中;您需要使用Win32等待方法之一而不是.NET等待方法,或者可能派生自定义类WaitHandle封装Win32对象)。 您将通过从缓存中删除块并强制进行垃圾回收来进行响应; 您必须测试这是否“足够快,以至于用户从不觉得系统变慢”。

此外,看文档,提高低内存通知的门槛是真正的低内存(4 GB的系统32 MB!)。 我怀疑那个时候用户可能已经感觉到速度减慢,并且将你的应用程序分页到内存中以便转储它的数据块可能会导致可感知的磁盘访问。 再次,您可以通过测试来评估这一点。

您可以使用WeakReference类对内存块进行弱引用。 这允许垃圾收集器如果需要的话删除对象。

Yor对象将在大对象堆中,因为它们大于85 kb。 最常见的垃圾收集只看第一代堆,所以它不会收集你的对象。 如果系统通知.NET系统内存不足,垃圾收集器将运行更彻底的收集,将大对象堆中的对象删除。