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