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

StackOverflow https://stackoverflow.com/questions/90940

Вопрос

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

Это было полезно?

Решение

Вы можете использовать для этого существующие инструменты отладки памяти, я нашел средство проверки памяти 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);
}

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top