内存映射文件保留在物理内存中?

问题描述 投票:0回答:4

我有一个使用大量内存映射文件的进程。
问题是这些文件保存在物理内存中,即使机器内存不足,并且其他进程需要此内存。

我尝试使用 SetProcessWorkingSetSize 来限制进程工作集,但这没有帮助,进程的工作集不断增长超过最大值。

有没有更好的方法来限制进程的工作集?
我可以更改 Windows 的分页内存映射文件的启发式吗?

windows memory-management memory-mapped-files
4个回答
3
投票

最终使用暴力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);
        }
}

2
投票

如果您发现具有内存映射文件的进程保留了很多这样的页面,那么这意味着操作系统不需要丢弃任何内存映射区域来提供给其他进程。那么,您如何知道其他进程实际上需要当前用于映射文件的内存?仅仅因为操作系统物理内存不足没有任何意义。其他进程必须需要内存才能导致操作系统删除映射页面并为它们提供 RAM。

因此,您的 mmap-I/O 进程似乎正在让其他使用 RAM 频率较低的进程处于饥饿状态。一种方法是明智地锁定内存不足的进程中的内存。查看适用于 win32 的 VirtualLock。


0
投票

查看我的答案这里;使用 VirtualUnlock(),您可以手动取消提交部分 MMF;例如,您认为很快不会再次访问的部分。


0
投票

我认为这种行为是由于 MMF(内存映射文件)的工作方式造成的。看看this博客文章。它解释了 MMF 文件跳过 Windows 分页过程,因此不受页面文件支持。相反,MMF 本身就成为数据备份,这意味着它最终会占用更多 RAM,因为它没有被分页(呃,我不确定我自己是否明白这一点 - 最好阅读博客!)

这里内存映射文件的MSDN文档和这里另一个与MMF相关的SO问题。

© www.soinside.com 2019 - 2024. All rights reserved.