【问题标题】:How to force Windows to send 'LOW_MEMORY' signal to all applications?如何强制 Windows 向所有应用程序发送“LOW_MEMORY”信号?
【发布时间】:2013-10-24 08:07:05
【问题描述】:

我正在开发一些“空闲 RAM”工具,它必须强制 Windows 向所有应用程序发送 'LOW_MEMORY' 信号(要求所有应用程序释放其未使用的数据,SQL 服务器和文件缓存被清除,所以你会最终获得大量额外的可用空间)。

在 C++ 中最好的方法是什么? 对我来说最“自然”的解决方案是分配大量内存,但它是“好”和“稳定”吗?方式?也许在 WinAPI 或其他地方有任何 c++ Windows 原生函数?

附言 该工具的概念来自(我知道更好的方法是……购买一些 RAM,但我现在必须编写这样的工具):

https://superuser.com/questions/214526/how-does-a-free-up-ram-utility-free-up-ram

【问题讨论】:

  • 你为什么要使用/编写这样的工具?您的操作系统会在需要时自动释放 RAM。
  • ...阅读链接的问题应该已经让您知道这样的工具通常对您没有任何好处
  • 我写它是因为我工作的公司让我写它。所以没有关于它的“讨论”;)而且我知道大多数这样的程序(如CClenaer等)也是这样做的。所以我只想用 C++ 将该信号发送到 Windows 的应用程序,即使结果有点无意义。
  • 当你说“LOW_MEMORY”消息时,你说的是与CreateMemoryResourceNotification 相关的事件吗?
  • 只是一些提示:我认为内部内存管理的问题是在 NT API 中而不是在 WIN32 层/子系统中...您可能还想使用 Microsoft 支持工具中的 depends.exe 进行搜索.....

标签: c++ memory memory-management low-memory


【解决方案1】:

另一种可能性是遍历活动进程列表,并要求每个进程通过SetProcessWorkingSetSize( hProcess, (SIZE_T)-1, (SIZE_T)-1) 修剪其工作集,如here on MSDN 所述,如果您的意图是尝试提高某些特定应用程序的性能,则可能会跳过应用程序(基准测试绝对是您的朋友)。

这会导致操作系统将虚拟页面刷新到磁盘,从而为其他应用程序释放物理内存。我不确定这是否会导致,例如,SQL Server 放宽它的内存需求,但它当然值得一试。

【讨论】:

    【解决方案2】:

    在 MSDN 上有一些链接可能对您有用:

    希望这些能给你一个开始。释放内存的另一种方法是向窗口发出信号,将每个进程的内存分配给交换文件,这将释放物理内存。然后当用户使用一个特定的应用程序时,它将被操作系统移回物理内存,这样管理仍然大部分由操作系统处理。

    【讨论】:

    • 投票支持“up”以中和它;)很遗憾我无法标记您的两个答案,但我必须做出选择,James Hugard 给出了一个解决方案,但您仍然为开始更深入的研究提供了一个很好的观点.
    • 感谢您的投票:) 老实说只是好奇,喜欢 James 的回答,不错,简洁且对操作系统友好的方式来刷新虚拟内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2012-03-18
    相关资源
    最近更新 更多