65.9K
CodeProject 正在变化。 阅读更多。
Home

如何设置进程可以使用的最大内存(在操作系统级别)

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.63/5 (9投票s)

2007年3月1日

CPOL

2分钟阅读

viewsIcon

114215

描述了如何使用 WIN32 方法和 Job 的概念来为进程可以使用的内存量设置硬性限制。此外,还提供了 PInvoke 调用的 C# 封装。

引言

虽然这不是一个常见的需求,但我确实遇到了需要对进程可以使用的最大内存设置硬性的操作系统限制的情况。从我收集到的信息来看,Process.MaxWorkingSet 属性仅仅是一个建议,进程很容易绕过它。

本文介绍了为进程可以使用的内存设置硬性限制的通用方法,并提供了一个包含运行代码的链接。

方法

Windows 具有 Job 对象的概念,允许在操作系统级别管理系统资源,例如 CPU 或内存要求。

要设置硬性内存限制,过程很简单

  1. 使用 CreateJobObject 创建一个 Job 对象
  2. 使用 SetInformationJobObject 方法设置各种进程限制和控制,例如内存
  3. 最后,使用 AssignProcessToJob 将正在运行的进程分配给 Job,它将自动被限制在相关 Job 的限制范围内。

以下方法在 PublicDomain 包中演示了此代码

PublicDomain.Win32.Job.CreateJobWithMemoryLimits
    (uint minWorkingSetSize, uint maxWorkingSetSize, params Process[] processesToLimit)

这允许您传递最小/最大内存限制和要应用限制的正在运行的进程列表。

您可以观察任务管理器中的内存上升并达到您设置的最大值,随后抛出 OutOfMemory 异常(如果 GC 无法回收足够的所需内存)。

该代码返回一个 C# Job 对象,它是 WIN32 CreateJobObject 方法返回的句柄的轻量级封装。 C# 类还实现了 IDisposable,一旦 Job 被释放,内存限制将被移除

using (Process p = new Process())
{
    p.StartInfo = new ProcessStartInfo("myexe.exe");
    p.Start();

    using (PublicDomain.Win32.Job j = PublicDomain.Win32.Job.CreateJobWithMemoryLimits(
        (uint)GlobalConstants.BytesInAMegabyte * 12,
        (uint)GlobalConstants.BytesInAMegabyte * 30,
        p))
    {
        // As long as the Job object j is alive, there
        // will be a memory limit of 30 Mb on the Process p
    }
}

PublicDomain

PublicDomain 包是完全免费的公共领域 .NET 常用代码和包的集合。 没有许可证,因此即使在企业应用程序中也可以包含代码(或任何部分)。 公共领域代码没有版权。

历史

  • 2007 年 3 月 1 日:首次发布
© . All rights reserved.