我有一个使用大量内存映射文件的进程。
问题是这些文件保存在物理内存中,即使机器内存不足,并且其他进程需要此内存。
我尝试使用 SetProcessWorkingSetSize 来限制进程工作集,但这没有帮助,进程的工作集不断增长超过最大值。
有没有更好的方法来限制进程的工作集?
我可以更改 Windows 的分页内存映射文件的启发式吗?
最终使用暴力VirtualUnlock。
PROCESS_MEMORY_COUNTERS pmc;
if (GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
{
if (pmc.WorkingSetSize > MaxWorkingSetSize)
{
VirtualUnlock(FilePtr.pData, MaxWorkingSetSize);
UnmapViewOfFile(FilePtr.pData);
CloseHandle(FilePtr.hFileMap);
CloseHandle(FilePtr.hFile);
}
}
如果您发现具有内存映射文件的进程保留了很多这样的页面,那么这意味着操作系统不需要丢弃任何内存映射区域来提供给其他进程。那么,您如何知道其他进程实际上需要当前用于映射文件的内存?仅仅因为操作系统物理内存不足没有任何意义。其他进程必须需要内存才能导致操作系统删除映射页面并为它们提供 RAM。
因此,您的 mmap-I/O 进程似乎正在让其他使用 RAM 频率较低的进程处于饥饿状态。一种方法是明智地锁定内存不足的进程中的内存。查看适用于 win32 的 VirtualLock。
查看我的答案这里;使用 VirtualUnlock(),您可以手动取消提交部分 MMF;例如,您认为很快不会再次访问的部分。