windows - 内存密集型应用程序的内存管理

标签 windows memory-management

注意:我知道问题 Memory management in memory intensive application ,但是这个问题似乎是关于频繁分配内存的应用程序,而我的问题是关于故意设计为消耗尽可能多的物理内存的应用程序是安全的。

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

问题在于,如果低估了内存使用量,或者如果负载增加,则可能会因为内存分配失败而导致严重的失败 - 在这种情况下,显然最好的办法是释放内存以防止失败以牺牲性能为代价。

一些假设:

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

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

  • 如何预测内存分配是否会失败?
  • 我是否应该保留一定数量的空闲内存以确保核心操作系统操作保持响应(并且不会以这种方式对应用程序性能产生不利影响),我如何才能知道有多少内存?

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

我是一名 C# 开发人员,但我希望任何此类应用的基本概念都是相同的,无论使用何种语言。

最佳答案

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

0 - 30% - 无交换 30 - 60% - 仅交换脏页 60 - 90% - 也根据 LRU 策略交换干净页面。

90% - Invoke OOM(Out of memory) killer and kill the process consuming maximum memory.

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

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

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

关于windows - 内存密集型应用程序的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2117427/

相关文章:

c - 在 C 中,多线程,多个窗口调用一个窗口过程,每次调用都会使用新的局部变量还是我需要互斥体?

node.js - 即使用户注销后也保持 Node 处于运行状态

java - JNA 内存泄漏 - 如何修复?

c++ - 从内存中获取文件句柄

在 tomcat 服务器上导入 72MB XAR 文件时出现 java 堆内存不足错误?

windows - 如何从内部卸载 Windows 内核模式驱动程序?

windows - 注册表拦截的替代方案

java - 我的 Java 应用程序内存不足

python - 在带有 Python 的 Windows 上使用符号链接(symbolic link)模块

c++ - 哪种内存分配算法最适合性能和时间要求严格的 C++ 应用程序?