参考url:
https://blog.csdn.net/fw0124/article/details/6367360/
https://processhacker.sourceforge.io/downloads.php
https://technet.microsoft.com/zh-cn/ms684903(v=vs.90)
https://docs.microsoft.com/en-us/windows/desktop/api/MemoryApi/nf-memoryapi-queryvirtualmemoryinformation
0 相关名词解释
PrivateWorkingSet: 进程独自占用的物理内存
SharedWorkingSet: 进程在物理内存中跟其他进程共享的内存, 例如: dll占用的内存
WorkingSet: 进程占用的物理内存总和, 即PrivateWorkingSet与SharedWorkingSet的和
commitBytes(Private Bytes): 当前进程独自占用的虚拟内存总和, 包括PrivateWorkingSet 以及换到页面文件中的部分
根据网上的参考资料, 一个进程总的内存占用包括PrivateWorkingSet, SharedWorkingSet, 在硬盘页面文件中的部分
1 获取进程的内存占用的相关方法
<1> GetProcessMemoryInfo
第二个参数返回结果, 不能获取PrivateWorkingSet
PROCESS_MEMORY_COUNTERS_EX结构中,
WorkingSetSize: 对应任务管理器中的工作集(WorkingSet)
PeakWorkingSetSize: 对应任务管理器中的峰值工作集
PagefileUsage: 对应任务管理器中的提交大小(commitBytes), Windows 7 and Windows Server 2008 R2 and earlier: PagefileUsage is always zero.
PeakPagefileUsage: 峰值提交大小
PrivateUsage: 对应任务管理器中的提交大小(commitBytes)
<2>QueryWorkingSet
只能在app跟system都是x64或者x86的情况下使用, wow64下能返回结果, 但是跟实际完全不一样
PSAPI_WORKING_SET_BLOCK结构中,
统计Shared ==0(ProcessExplorer中使用该方法)的页面个数然后 乘以 每个页面的大小0x1000 就是该进程的PrivateWorkingSet
<3>QueryWorkingSetEx
这个没用过,因为不知道这个怎么用
<4>NtQuerySystemInformation
这个可以在win7及以上所有环境下使用, 由于是微软未文档化的函数,所以不排除将来有修改的可能, 以下例子是从ProcessHacker的源码中抽取出来的
https://files.cnblogs.com/files/talenth/GetProcessInfo.7z
<5>可能还有其他的方法, 目前没有找到...
原文地址:https://www.cnblogs.com/talenth/p/9762528.html