Чем можно объяснить разницу в использовании памяти, сообщаемую FastMM или GetProcessMemoryInfo? - PullRequest
3 голосов
/ 14 марта 2012

Мое приложение Delphi XE основано на одном EXE-файле, использующем DLL локального сервера, созданного RemObjects, и использует много памяти для конкретной операции, пока не сгенерирует исключение, говорящее о том, что не хватает памяти.Поэтому я пытаюсь понять, почему и где это происходит, поэтому я разместил различные шаги в моем коде, где я сообщаю об использовании памяти.Проблема в том, что я получаю совершенно другую информацию, основанную на методе, используемом для получения информации об использовании памяти:

  1. Если я использую описанный здесь метод , который запрашивает FastMMнепосредственно для клиента EXE и серверной DLL вот что я получаю:

    • ШАГ 1: [клиент] = 36664572 - [сервер] = 3274976
    • ШАГ 2: [клиент] = 62641230 - [сервер] = 44430224
    • ШАГ 3: [клиент] = 66665630 - [сервер] = 44430224
  2. Теперь, если я использую метод объяснил здесь , который использует GetProcessMemoryInfo, я получаю гораздо больше использования памяти:

    • ШАГ 1: [процесс] = 133722112
    • ШАГ 2: [процесс] = 1072115712
    • ШАГ 3: [процесс] = 1075818496

Похоже, что второй метод является правильным, основанным на моих проблемах с памятью, но как мог метод FastMM быть таким"низкий" ?А чем можно объяснить разницу?

1 Ответ

5 голосов
/ 14 марта 2012

GetProcessMemoryInfo также сообщает о памяти, которая не управляется FastMM, например, память, которая выделяется различными не Delphi-библиотеками, которые вы можете вызвать (например, winapi).

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

И, наконец, с помощью GetProcessMemoryInfo вы измеряете размер рабочего набора. Это то, что часть памяти приложения постоянно находится в оперативной памяти, а не в файле подкачки. Он включает в себя не только структуры данных и определенно не сопоставим с общей памятью, выделенной приложением. PagefileUsage будет более сопоставимым. Размер рабочего набора почти никогда не является тем, что вы ищете. См. здесь для лучшего объяснения.

Так что они оба дают разные результаты, потому что они оба измеряют разные вещи.

...