0

クライアントはいくつかの特定のシナリオでOOMを経験しており、メモリ リークを特定できないため、メモリ フラグメンテーションの問題であるかどうかを理解したいと考えています。

OSX と WIN の両方にさまざまなメモリ メトリック (常駐、ダーティ、ワーキング セット、予約済み、コミット済みなど) があり、フラグメンテーションの測定にどのメトリックを使用できるかわかりません。

vmmapOSXのコマンドは断片化列を提示し、次のように測定されるようです:

(DIRTY+SWAP FRAG SIZE) = DIRTY SIZE - BYTES ALLOCATED

FRAG = (DIRTY+SWAP FRAG SIZE) / DIRTY SIZE x 100.0

問題は、どのように取得できるDIRTY SIZEBYTES ALLOCATEDです。

割り当てられて使用されたメモリの量を示すmstatsがありmallocますが、報告された値は vmmap に表示されるものと一致しません。

WINもまったく別の話です。次の値を確認しましたが、フラグメンテーションの測定に使用できるかどうかはわかりません。

static void vminfo (unsigned long *free, unsigned long *reserved, unsigned long *committed) {
    MEMORY_BASIC_INFORMATION memory_info;
    memory_info.BaseAddress = 0;
    *free = *reserved = *committed = 0;
    while (VirtualQuery (memory_info.BaseAddress, &memory_info, sizeof (memory_info))) {
        switch (memory_info.State) {
        case MEM_FREE:
            *free += memory_info.RegionSize;
            break;
        case MEM_RESERVE:
            *reserved += memory_info.RegionSize;
            break;
        case MEM_COMMIT:
            *committed += memory_info.RegionSize;
            break;
        }
        memory_info.BaseAddress = (char *) memory_info.BaseAddress + memory_info.RegionSize;
    }
}

また、GetProcessMemoryInfoと同じ話を調べましたが、 PROCESS_MEMORY_COUNTERS_EXの値を使用して断片化を測定できるかどうか、またどのように使用できるかはわかりません。

TLDR: OSX と WIN でフラグメンテーションを測定するにはどうすればよいですか?

4

0 に答える 0