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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
228
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

похоже, вы пропустили ссылку на MemoryValidator, так как есть довольно много инструментов с таким именем, которые вы, возможно, захотите сделать явным

ShuggyCoUk 22.05.2009 11:23

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

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

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

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