我需要一种方法来限制服务可以分配的内存量,以防止服务导致系统饥饿,类似于 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。参数不正确”。
我还尝试使用作业对象来实现相同的目标。启动子进程时,我使用作业对象时存在内存限制。但是,我需要服务能够设置自己的内存限制,而不是依赖“启动”服务来完成此操作。到目前为止,我还没有找到单个进程创建作业对象然后将自身添加到作业对象的方法。这总是失败并拒绝访问。
有什么想法或建议吗?