Как я могу узнать, сколько адресного пространства использует приложение, и сообщить об этом пользователю? - PullRequest
2 голосов
/ 18 сентября 2008

Я пишу диспетчер памяти для приложения, как часть команды из двадцати с лишним кодеров. У нас заканчивается квота памяти, и мы должны быть в состоянии увидеть, что происходит, поскольку мы, похоже, используем только около 700 МБ. Мне нужно иметь возможность сообщить, куда все это идет - фрагментация и т. Д. Есть идеи?

Ответы [ 3 ]

3 голосов
/ 18 сентября 2008

Для этого вы можете использовать существующие средства отладки памяти, я считаю Memory Validator 1 весьма полезным, он может отслеживать как уровень API (куча, новый ...), так и уровень ОС (виртуальная память) выделения и показать карты виртуальной памяти.

Другой вариант, который я также нашел очень полезным, - это возможность создавать карту всего виртуального пространства на основе функции VirtualQuery. Мой код для этого выглядит так:

void PrintVMMap()
{
  size_t start = 0;
  // TODO: make portable - not compatible with /3GB, 64b OS or 64b app
  size_t end = 1U<<31; // map 32b user space only - kernel space not accessible
  SYSTEM_INFO si;
  GetSystemInfo(&si);
  size_t pageSize = si.dwPageSize;
  size_t longestFreeApp = 0;

  int index=0;
  for (size_t addr = start; addr<end; )
  {
    MEMORY_BASIC_INFORMATION buffer;
    SIZE_T retSize = VirtualQuery((void *)addr,&buffer,sizeof(buffer));
    if (retSize==sizeof(buffer) && buffer.RegionSize>0)
    {
      // dump information about this region
      printf(.... some buffer information here ....);
      // track longest feee region - usefull fragmentation indicator
      if (buffer.State&MEM_FREE)
      {
        if (buffer.RegionSize>longestFreeApp) longestFreeApp = buffer.RegionSize;
      }
      addr += buffer.RegionSize;
      index+= buffer.RegionSize/pageSize;
    }
    else
    {
      // always proceed
      addr += pageSize;
      index++;
    }
  }
  printf("Longest free VM region: %d",longestFreeApp);
}
1 голос
/ 18 сентября 2008

Вы также можете узнать информацию о кучах в процессе с помощью Heap32ListFirst / Heap32ListNext и о загруженных модулях с Module32First / Module32Next из API справки по инструменту.

«Справка по инструментам» была создана в Windows 9x. Исходным API информации о процессах в Windows NT был PSAPI, который предлагает функции, которые частично (но не полностью) перекрываются с помощью справки инструментов.

0 голосов
/ 19 сентября 2008

Наше (огромное) приложение (игра Win32) недавно стало выдавать исключения «Недостаточно квоты», и мне было поручено выяснить, куда уходит вся память. Это не тривиальная работа - этот вопрос и этот были моими первыми попытками выяснить. Поведение кучи является неожиданным, и точное отслеживание количества используемой вами квоты и количества доступного до сих пор оказалось невозможным. На самом деле, в любом случае, это не особо полезная информация - «квота» и «куда-то складывать вещи» - это тонко и раздражающе разные понятия. Принятый ответ так же хорош, как и получается, хотя перечисление куч и модулей также удобно. Я использовал DebugDiag от MS, чтобы увидеть истинный ужас ситуации и понять, как трудно на самом деле тщательно все отслеживать.

...