Почему моя программа пропускает виртуальную память? - PullRequest
2 голосов
/ 17 марта 2011

В поисках утечки памяти я использую MemProof и могу видеть в реальном времени количество используемых, созданных и уничтоженных ресурсов.Проработав мою программу более полутора дней, я заметил, что при прочих равных условиях виртуальная память (ВМ) увеличивается.Он начался в 109, а теперь в 113 после 24 часов.

Это то, что MemProof говорит для каждой утечки ВМ:

VirtualAlloc (address_location, 16384, 4096, 4);Он идентифицируется как виртуальная память, и его размер всегда равен 16384. Имя API - VirtualAlloc.Этот модуль - kernel32.dll.

Кроме того, memproof говорит: «virtualalloc резервирует или фиксирует область страниц в виртуальном адресном пространстве вызывающего процесса. Выделенные страницы должны быть освобождены с помощью virtualFree, когда они больше не нужны».

Утечка ВМ связана с функцией в файле System.Pas.

Функция выглядит следующим образом:

function GetCmdShow: Integer;
var
  SI: TStartupInfo;
begin
  Result := 10;                  { SW_SHOWDEFAULT }
  GetStartupInfo(SI);
  if SI.dwFlags and 1 <> 0 then  { STARTF_USESHOWWINDOW }
    Result := SI.wShowWindow;   
end;  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

У меня меньше знаков, указывающих наКлючевое слово "end" - это то, куда Memproof ведет меня, когда я нажимаю на утечку (и) виртуальной памяти.

Итак, что это значит?

1 Ответ

5 голосов
/ 17 марта 2011

Менеджер памяти Delphi FastMM работает поверх системы памяти Windows. Он выделяет большие блоки памяти из ОС с помощью VirtualAlloc, а затем разделяет их на более мелкие куски для работы с вашей программой. Если вы освободите большие объемы памяти, она вернет часть операционной системы. Однако, если вы освобождаете небольшие объемы памяти, она, вероятно, продержится, потому что вам, скорее всего, она снова понадобится в ближайшее время. Это часть того, что делает FastMM быстрым, и это не утечка памяти.

Любой профилировщик памяти, который наблюдает только за VirtualAlloc и не обращает внимания на то, что делает FastMM, даст вам результаты, которые не имеют смысла. Как отметил Дэвид в комментарии, если вы хотите отследить реальные утечки памяти, вам нужно использовать инструменты FastMM. Загрузите полную версию FastMM с SourceForge и прочитайте документацию, чтобы узнать, как включить FullDebugMode, а также создавать отчеты и протоколирование утечек, и вам будет намного проще.

...