获取进程占用的内存

参考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