微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

如何在C#应用程序中将embedded式PowerShell会话configuration为64位

如何获得一个稳定的机器ID **没有**pipe理员权限

WCF wsHttpBinding的Windows身份validation有多安全?

在多台服务器上同步内容

禁用单个应用程序的凭证pipe理器

编程添加路线

.NET中的vista / win7放大API

我如何快速创build大(> 1GB)的文本+二进制文件与“自然”的内容? (C#)

使用C#获取连接到命名pipe道服务器的客户端的进程ID

如何在C#和Windows 7中设置音量?

一种选择是使用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系统内存不足,垃圾收集器将运行更彻底的收集,将大对象堆中的对象删除

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐