内存映射文件是否保留在物理内存中?
-
06-07-2019 - |
题
我有一个使用大量内存映射文件的进程。
问题是这些文件保存在物理内存中,即使机器内存不足,其他进程也需要这些内存。
我尝试过使用 SetProcessWorkingSetSize 限制流程工作集,但它没有帮助,流程的工作集不断增长超过最大值。
是否有更好的方法来限制流程的工作集?
我可以为分页内存映射文件更改Windows的heuristcs吗?
解决方案 2
使用强力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较低就没有任何意义。其他进程必须要求内存使操作系统删除映射的页面并为其提供RAM。
因此,您的mmap-I / O进程似乎正在使您的其他进程不再使用RAM。一种方法是明智地锁定正在饥饿的进程中的内存。查看VirtualLock for win32。
检查我的答案此处;使用VirtualUnlock(),您可以手动取消提交部分MMF;例如,您认为不会很快再次访问的部分。
我认为这种行为是由于MMF(内存映射文件)的工作方式。请查看此博客文章。它解释了MMF文件跳过Windows分页过程,因此不受页面文件的支持。相反,MMF本身就变成了数据备份,这意味着,它最终会占用更多的RAM,因为它不是页面输出(呃,我不确定自己是不是这样 - 最好阅读博客!)
这里是内存映射文件的MSDN文档和这里是另一个与MMF有关的SO问题。
不隶属于 StackOverflow