如何限制应用程序可以分配的内存

2024-01-01

我需要一种方法来限制服务可以分配的内存量,以防止服务导致系统饥饿,类似于 SQL Server 允许您设置“最大服务器内存”的方式。

我知道 SetProcessWorkingSetSize 并不完全符合我的要求,但我试图让它按照我认为应该的方式运行。无论我使用什么值,我的测试应用程序的工作集都不受限制。此外,如果我随后立即调用 GetProcessWorkingSetSize,则返回的值不是我之前指定的值。这是我的测试应用程序使用的代码:

var
  MinWorkingSet: SIZE_T;
  MaxWorkingSet: SIZE_T;
begin
  if not SetProcessWorkingSetSize(GetCurrentProcess(), 20, 12800 ) then
    RaiseLastOSError();

  if GetProcessWorkingSetSize(GetCurrentProcess(), MinWorkingSet, MaxWorkingSet) then
    ShowMessage(Format('%d'#13#10'%d', [MinWorkingSet, MaxWorkingSet]));

没有发生错误,但 GetProcessWorkingSetSize 返回的 Min 和 Max 值都是 81,920。

我尝试在 Flags 参数中使用 QUOTA_LIMITS_HARDWS_MAX_ENABLE ($00000004) 来使用 SetProcessWorkingSetSizeEx。不幸的是,如果我在 Flags 中传递除 $00000000 以外的任何内容,SetProcessWorkingSetSizeEx 会失败并显示“代码 87。参数不正确”。

我还尝试使用作业对象来实现相同的目标。启动子进程时,我使用作业对象时存在内存限制。但是,我需要服务能够设置自己的内存限制,而不是依赖“启动”服务来完成此操作。到目前为止,我还没有找到单个进程创建作业对象然后将自身添加到作业对象的方法。这总是失败并拒​​绝访问。

有什么想法或建议吗?


的文档SetProcessWorkingSetSize https://msdn.microsoft.com/en-us/library/windows/desktop/ms686234(v=vs.85).aspx函数说:

dwMinimumWorkingSetSize [in]

...

该参数必须大于 零但小于或等于最大工作集大小。这 默认大小为 50 页(例如,这是 204,800 字节) 具有 4K 页面大小的系统)。如果该值大于零但 小于20页,最小值设置为20页。

如果页面大小为 4K,则强制的最小值为 20 * 4096 = 81920 字节,这就是您看到的值。这些值以字节为单位指定。

要实际限制服务进程的内存,我认为可以创建一个新作业(CreateJobObject https://msdn.microsoft.com/en-us/library/windows/desktop/ms682409(v=vs.85).aspx),设置内存限制(SetInformationJobObject https://msdn.microsoft.com/en-us/library/windows/desktop/ms686216(v=vs.85).aspx)并将当前流程分配给作业(AssignProcessToJobObject https://msdn.microsoft.com/en-us/library/windows/desktop/ms681949(v=vs.85).aspx)在服务的启动例程中。

不幸的是,在 8 之前的 Windows 和 Server 2012 上,如果进程已经属于某个作业,则此操作将不起作用:

Windows 7、Windows Server 2008 R2、Windows XP SP3、Windows Server 2008、Windows Vista 和 Windows Server 2003:该进程不得 已经被分配工作;如果是,该函数将失败 错误_访问_拒绝。从 Windows 8 开始,此行为发生了变化 Windows 服务器 2012。

如果这是你的情况(即你得到ERROR_ACCESS_DENIED在旧版 Windows 上)检查进程是否已分配给作业(在这种情况下,你就不走运了),但也要确保它具有所需的访问权限:PROCESS_SET_QUOTA and PROCESS_TERMINATE.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何限制应用程序可以分配的内存 的相关文章

  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • c# 通过内存地址调用方法

    我正在尝试在 C 中的指定内存地址调用函数 以下是我在 C 中的操作方法 typedef void do int i auto doActor do 0xAAAABEEF doActor 1 如果可能的话 如何在 C 中复制这种行为 对 C
  • Objective-C:int值无故改变

    Objective C 我需要帮助保留 int 的值 无需我的命令 它就在我身上发生变化 最初的问题是 如何声明和保留 int 这在另一篇文章中得到了满足 Objective C 如何声明和保留 int https stackoverflo
  • Rails Windows Vagrant 响应时间非常慢

    我在跑 Vagrant 1 7 1 Rails 4 1 4 Thin 1 6 1 Windows 7 每个静态文件的发送时间都超过一秒 在我的 PC 上加载一个页面可能需要大约 20 秒 而在同事的 Linux 机器上则只需瞬间 有一些帖子
  • 串行 I/O 与 Windows/Windows CE 重叠/不重叠

    抱歉 这不是一个大问题 但更多的是帮助那些在这些特定问题上遇到问题的人 我正在解决的问题需要使用串行 I O 但主要在 Windows CE 6 0 下运行 然而 最近有人问我该应用程序是否也可以在 Windows 下运行 所以我开始着手解
  • 防止 WNetAddConnection2 类允许被禁止的用户访问共享文件夹

    我开发了 C windows 应用程序 操作系统是Windows 7 要求 是使用带有凭据的代码访问网络共享文件夹 Test WNetAddConnection2 class 限制 是某些用户可以访问此共享文件夹 测试 但对于其他用户 设置
  • logback的“谨慎模式”是如何实现的?

    The 审慎模式 http logback qos ch manual appenders html prudentlogback 中的序列化所有 JVM 之间的 IO 操作 写入同一文件 可能运行在不同的主机上 在其他日志记录框架中 如果
  • 如何在Windows下调试Python中的访问冲突内存问题?

    您建议使用哪些工具或流程来调试 ctypes 内存问题 为什么可以打印数组的内容但无法复制它 我已将问题范围缩小到以下几行 lots of code valid data as bytes bytearray self output buf
  • 如何在Delphi中将对象方法作为参数传递,然后调用它?

    我担心这可能是一个有点愚蠢的问题 但这让我很难过 我正在寻找将对象的方法传递到过程中的最简单的方法 以便过程可以调用对象的方法 例如 超时后 或者可能在不同的线程中 所以基本上我想 捕获对对象方法的引用 将该引用传递给过程 使用该引用 从过
  • 如何在 Ubuntu VirtualBox 中运行 Meteor 应用程序并使用 Windows 主机上的编辑器进行编辑?

    我希望在运行 Ubuntu 的 virtualbox 来宾中运行一个用于开发目的的流星服务器 该项目将位于主机上的一个文件夹内 该文件夹将共享给来宾 该文件夹本身位于 Dropbox 文件夹内 这样我可以在多个虚拟机和工作站之间共享开发 但
  • 无法加载 JNI 共享库 (JDK)

    当我尝试打开时Eclipse http www eclipse org 弹出对话框指出 无法加载 JNI 共享库 C JDK bin client jvm dll 此后 Eclipse 强制关闭 我想提出以下几点 我检查了这条路径上是否存在
  • Delphi - 如果没有创建类,为什么这个函数可以工作?

    考虑这个类 unit Unit2 interface type TTeste class private texto string public function soma a b integer string end implementa
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • Windows 上的 ffmpeg-android ndk

    我正在尝试编译 bash 文件 带有 android ndk 的 ffmpeg 我收到如下错误 arm linux androideabi gcc 无法创建可执行文件 C 编译器测试失败 Makefile 2 config mak 没有这样
  • 如何在 Windows 下向 .sh 脚本传递参数?

    我正在尝试在 Windows 下执行 sh 脚本 我安装了 Git 它允许我执行 sh 文件 但是 如果不使用 sh 作为执行前缀 我似乎无法传递任何参数 我的 sh 文件 echo Test 1 如果我用以下命令执行它 gt sh tes
  • 如何在Windows服务器上将node.js文件作为后台进程运行?

    我正在创建一个 node js 项目并将其上传到我的 Windows 服务器 以为移动应用程序提供 API 服务 当我打开命令提示符并键入 node app js 它运行正常 但是当我关闭命令提示符时 我的 Node js 服务器停止运行
  • Windows 上的 boot2docker 缺少 apt-get / 包管理器

    我在 boot2docker 中 我不确定我完全理解它 但它似乎是我正在进行的项目所需要的 我已经通过 ssh 登录了 并且尝试对我们的项目进行 make 但是我得到了 make not found 然后我尝试了一个 apt get ins
  • 在 Windows 上查找父进程 ID

    Problem 给定远程 Windows 主机上的进程 ID 和命令行访问权限 如何找到其父进程的 PID Solution 鉴于 Marc B 的回答 我们可以使用 WMIC 命令示例here https learn microsoft

随机推荐