クライアントはいくつかの特定のシナリオでOOMを経験しており、メモリ リークを特定できないため、メモリ フラグメンテーションの問題であるかどうかを理解したいと考えています。
OSX と WIN の両方にさまざまなメモリ メトリック (常駐、ダーティ、ワーキング セット、予約済み、コミット済みなど) があり、フラグメンテーションの測定にどのメトリックを使用できるかわかりません。
vmmap
OSXのコマンドは断片化列を提示し、次のように測定されるようです:
(DIRTY+SWAP FRAG SIZE) = DIRTY SIZE - BYTES ALLOCATED
FRAG = (DIRTY+SWAP FRAG SIZE) / DIRTY SIZE x 100.0
問題は、どのように取得できるDIRTY SIZE
かBYTES 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 でフラグメンテーションを測定するにはどうすればよいですか?