Какие есть средства для просмотра фрагментации ОЗУ?

Рейтинг: 1Ответов: 2Опубликовано: 05.07.2023

Есть ли какие-то средства для просмотра фрагментации ОЗУ?

Хочется видеть, как приложение выделяет память, потому что иногда получается, что из 32 ГБ памяти занято 12-16 ГБ, но занятая память сильно "разбросана", что не позволяет выделить кусок памяти ~10 ГБ.

Я знаю про множество приложений для просмотра жестких дисков, но не нашел ни одного для просмотра RAM.

Ниже пример приложения для жесткого диска, нужно что-то похожее для оперативной памяти.

Фрагментация жесткого диска

Ответы

▲ 2

утилита vmmap показывает блоки виртуального адресного пространства процесса и предоставляет средства для профилирования. введите сюда описание изображения

Профилировщик памяти в Visual Studio. Gредоставляет средства для профилирования кучи для С++ приложений.

введите сюда описание изображения

▲ 1

Ну, в принципе, можно поиграться самостоятельно с HeapWalk (у вас же Windows?), например. Только тяжелая это работа, потому что даже пустая программа уже выделяет массу блоков памяти. Да и зависит от того, как менеджер памяти работает — он же может, например, запросить разово большой блок, а потом его уже внутри программы перераспределять. Так что сработает ли — зависит от массы факторов, в том числе от компилятора.

Просто как маленький пример —

int main(int argc, char * argv[])
{
    HANDLE ph[20];
    int hCount = GetProcessHeaps(20,ph);

    char * q = new char[10000000];
    q[3] = 0;

    for(int i = 0; i < hCount; ++i)
    {
        PROCESS_HEAP_ENTRY phe;
        phe.lpData = NULL;
        cout << "Heap #" << i << endl;

        for(;HeapWalk(ph[i],&phe);)
        {
            if (phe.wFlags & PROCESS_HEAP_ENTRY_BUSY)
                cout << "    Block at " << phe.lpData << ", size " << phe.cbData << endl;
        }
    }
}

На VC++ 2022 у меня выдает список из почти 200 блоков памяти, который заканчивается

Block at 000002414B410FA0, size 18
Block at 000002414B410FD0, size 4096
Block at 000002414B546040, size 10000000

т.е. вот он, последний выделенный блок :)

Так что если желание есть — попробуйте, только не уверен, что просто информация о фрагментации как-то позволит ее уменьшить, не переделывая кардинально программу, типа написания собственных аллокаторов, или своего менеджера памяти, который в начале работы заберет один большой кусок памяти и сам будет ее перераспределять под ваши потребности.