Как получить информацию, показанную в vmmap программно?
Любой, кто наблюдал за выступлением Марка Руссовича "Раскрытые тайны управления памятью", знает, что инструмент vmmap может показать вам то, что считается с вашим лимитом процесса (2 ГБ в 32-битных окнах vanilla), о котором, похоже, знают немногие другие инструменты.
Я хотел бы иметь возможность программно контролировать мой реальный общий объем памяти (тот, который имеет отношение к пределу процесса), чтобы я мог по крайней мере регистрировать, что происходит, когда я приближаюсь к пределу процесса. Есть ли общедоступная информация о том, как vmmap это делает?
... Кроме того, почему эту информацию так чертовски трудно получить??
Вещи, которые я знаю об этом (AFAIK), не совсем дают вам полную картину:
- :: GetProcessMemoryInfo выглядит так, как будто он возвращает только информацию об использовании частной памяти
- System.Diagnostics.Process.VirtualMemorySize64 возвращает довольно большое число, которое все еще не совсем соответствует общему количеству, показанному vmmap - фактически это не соответствует НИЧЕМУ, показанному в vmmap:(
2 ответа
Я использовал Dependency Walker, чтобы посмотреть, какие функции Windows API были импортированы из Kernel32.dll
от vmmap.exe
и нашел следующие функции, которые, вероятно, актуальны:
VirtualAlloc
VirtualAllocEx
VirtualFree
VirtualProtectEx
VirtualQueryEx
Взгляните на них и посмотрите, сможете ли вы найти то, что vmmap
делается. Конечно, любые другие вызовы API выполняются динамически (т.е. через LoadLibrary
) не будет отображаться в ходок зависимости. Также известно, что он ломается при работе с загруженными параллельно библиотеками DLL.
В twpol / vmmap есть реализация командной строки с открытым исходным кодом, похожая на VMMap, и она успешно отображает всю ту же информацию о процессе, которую выполняет SysInternals VMMap.
Смотрите также этот форк, который реализует быстрое перечисление кучи, но я лично не тестировал этот.