分享

VC 监控进程内存使用情况

 SamBookshelf 2013-12-19
 VC & 监控进程内存使用情况 

VC中使用GetProcessMemoryInfo函数得到的PROCESS_MEMORY_COUNTERS结构体一直让人很困惑,

尤其是将得到的值与任务管理器中显示的值对比时,更容易发现不吻合的情况。

以下例程中有PROCESS_MEMORY_COUNTERS结构体各项与任务管理器中显示的对应关系。

  1. //ProcessMemory.cpp    
  2.   
  3. //用法:  
  4. //    argv[1]是子进程的包含路径的完整可执行文件名  
  5. //    ProcessMemory notepad  
  6.   
  7. //编译:  
  8. //    cl ProcessMemory.cpp    
  9.     
  10. //功能:     
  11. //    获取子进程的内存使用情况  
  12.     
  13.     
  14. #include <stdio.h>     
  15. #include <windows.h>  
  16. #include <psapi.h>  
  17. #pragma comment(lib, "psapi.lib")   
  18.   
  19. int main(int argc, char *argv[])     
  20. {  
  21.     //CreateProcess的第一个参数     
  22.     STARTUPINFO StartupInfo = {0};     
  23.     StartupInfo.cb = sizeof(STARTUPINFO);   
  24.     
  25.     
  26.     //CreateProcess的第二个参数     
  27.     PROCESS_INFORMATION ProcessInfo = {0};     
  28.     
  29.     
  30.     CreateProcess(NULL, argv[1], NULL, NULL, TRUE, NULL, NULL, NULL, &StartupInfo, &ProcessInfo);  
  31.   
  32.   
  33.     //作用为:子进程运行结束后,查看它的内存使用情况。  
  34.     //    此时,所有非Peak的项均为0,所有Peak项显示运行期间的峰值  
  35.     //如果想在子进程结束之前监控它的内存使用情况,可以将这句替换为  
  36.     //    Sleep(1000);  
  37.     //    作用为:子进程运行1000毫秒之后,查看它的内存使用情况  
  38.     WaitForSingleObject(ProcessInfo.hProcess, INFINITE);  
  39.   
  40.   
  41.     PROCESS_MEMORY_COUNTERS pmc;  
  42.     GetProcessMemoryInfo(ProcessInfo.hProcess, &pmc, sizeof(pmc));  
  43.     //以下各项均以KB为单位  
  44.     //在任务管理器中显示为:峰值工作设置(内存)  
  45.     printf("%d\n", pmc.PeakWorkingSetSize/1024);  
  46.     //在任务管理器中显示为:工作设置(内存)  
  47.     printf("%d\n", pmc.WorkingSetSize/1024);  
  48.     printf("%d\n", pmc.QuotaPeakPagedPoolUsage/1024);  
  49.     //在任务管理器中显示为:分页池  
  50.     printf("%d\n", pmc.QuotaPagedPoolUsage/1024);  
  51.     printf("%d\n", pmc.QuotaPeakNonPagedPoolUsage/1024);  
  52.     //在任务管理器中显示为:非页面缓冲池  
  53.     printf("%d\n", pmc.QuotaNonPagedPoolUsage/1024);  
  54.     printf("%d\n", pmc.PeakPagefileUsage/1024);  
  55.     //在任务管理器中显示为:内存(专用工作集) //这是任务管理器的默认显示项!  
  56.     printf("%d\n", pmc.PagefileUsage/1024);  
  57.   
  58.   
  59.     return 0;     
  60. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多