有意内存密集型应用程序的内存管理

Jus*_*tin 11 windows memory-management

注意:我知道内存密集型应用程序中的内存管理问题,但是这个问题似乎是关于频繁进行内存分配的应用程序,而我的问题是关于有意设计消耗尽可能多的物理内存的应用程序.

我有一个服务器应用程序,它使用大量内存来执行缓存和其他优化(想想SQL Server).应用程序在专用计算机上运行,​​因此可以(并且应该)消耗尽可能多的内存,以便加速和增加吞吐量和响应时间,而无需担心影响系统上的其他应用程序.

麻烦的是,如果内存使用被低估,或者负载增加,最终可能会因内存分配失败而导致令人讨厌的失败 - 在这种情况下,最好的做法是释放内存以防止故障,但代价是表现.

一些假设:

  • 该应用程序在专用计算机上运行
  • 应用程序的内存要求超出了计算机上的物理内存(也就是说,如果应用程序可以使用额外的内存,它总是能够以某种方式使用该内存来改善响应时间或吞吐量)
  • 以某种方式有效地管理存储器,使得存储器碎片不是问题.
  • 应用程序知道可以安全释放哪些内存,以及应该首先释放哪些内存以获得最小的性能影响.
  • 该应用程序在Windows计算机上运行

我的问题是 - 我应该如何在这样的应用程序中处理内存分配? 特别是:

  • 如何预测内存分配是否会失败?
  • 我是否应该留出一定的内存空间以确保核心操作系统操作保持响应(并且不会以这种方式对应用程序性能产生负面影响),以及如何找出内存量?

核心目标是防止因使用太多内存导致的故障,同时尽可能多地占用内存.

我是一个C#开发人员,但我希望任何这样的应用程序的基本概念都是相同的,无论语言如何.

Boo*_*ean 1

在linux中,内存使用百分比分为以下几个级别。

0 - 30% - 不交换 30 - 60% - 仅交换脏页 60 - 90% - 也基于 LRU 策略交换干净页。

90% - 调用 OOM(内存不足)杀手并终止消耗最大内存的进程。

检查这个 - http://linux-mm.org/OOM_Killer

认为 Windows 可能有类似的策略,因此您可以检查内存统计信息并确保永远不会达到最大阈值。

停止消耗更多内存的一种方法是进入睡眠状态并为内存清理线程提供更多运行时间。