首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 進程內存變化監測:RAII 類自動統計 Working Set 差值

     編輯:關於C語言

需求

在代碼塊進入/退出時自動對比進程工作集大小,輸出內存增長/釋放量(KB),快速定位內存洩漏或異常分配。

實現類 CAutoMem

class CAutoMem {
public:
    explicit CAutoMem(const char* vInfo) : strInfo(vInfo) { Init(); }
    ~CAutoMem() { PrintMem(); }

private:
    void Init() {
        hProcess = GetCurrentProcess();
        PROCESS_MEMORY_COUNTERS pmc;
        GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc));
        dwMemStart = pmc.WorkingSetSize;
    }

    void PrintMem() {
        PROCESS_MEMORY_COUNTERS pmc;
        GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc));
        long long diff = long long(pmc.WorkingSetSize) - dwMemStart;

        if (abs(diff) > 1024) { // 僅報告 >1KB 變化
            const char* action = diff > 0 ? "內存申請" : "內存釋放";
            printf("%s %s %lld KB\n\n", strInfo.c_str(), action, abs(diff) / 1024);
        }
    }

    std::string strInfo;
    HANDLE hProcess;
    SIZE_T dwMemStart;
};

使用示例

void testFunction() {
    CAutoMem memGuard("testFunction: ");
    // ... 可能分配/釋放內存的代碼 ...
    vector<int> v(1000000); // 申請 ~4MB
} // 作用域結束,自動打印:testFunction: 內存申請 4096 KB

關鍵 API 解析

  • GetCurrentProcess():獲取偽句柄,無需 CloseHandle。
  • GetProcessMemoryInfo:填充 PROCESS_MEMORY_COUNTERS,關鍵字段:
    • WorkingSetSize:當前物理內存頁數(工作集),最直觀反映內存佔用。
    • PagefileUsage:提交佔用(虛擬內存),含已換出頁面。
  • WorkingSetSize 受系統內存壓力影響會波動,**非精確分配量**,但趨勢明確。

優化建議

  1. 增加 PagefileUsage 監測,配合工作集分析虛擬內存行為。
  2. 支持巢狀作用域:用棧維護多層 dwMemStart,避免內層干擾外層統計。
  3. 輸出重定向至日誌系統(如 log4cplus),便於事後分析。
  4. 跨平台:Linux 讀取 /proc/self/status (VmRSS/VmSize)。

局限性

  • **僅反映物理駐留頁**,不等於 malloc/new 分配的虛擬地址空間。
  • 系統可能將非活躍頁移出工作集,導致「虛假釋放」信號。
  • 多線程並發分配時,僅能觀測進程級總量,無法定位具體線程/調用點。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved