我们的客户在某些特定情况下会遇到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 中的碎片?