• 获取进程占用的内存


    参考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>可能还有其他的方法, 目前没有找到...

  • 相关阅读:
    [資料]VS2008技巧
    [資料]MarshalAs的用法
    MS SQL Server 2000安装不成功的原因
    Zend產品線
    [轉]Flex 开发必备10武器
    [轉]C#中的XML注释
    [轉]onpropertychange事件
    [轉]fckeditor添加自定义按钮
    [資源]Web設計資源以及线框工具
    [轉]JS中showModalDialog 详细使用
  • 原文地址:https://www.cnblogs.com/talenth/p/9762528.html
Copyright © 2020-2023  润新知