Чем можно объяснить разницу в использовании памяти, сообщаемую FastMM или GetProcessMemoryInfo?
My Delphi XE-приложение основано на одном EXE-файле, использующем DLL локального сервера, созданного RemObjects, и использует много памяти для конкретной операции, пока не сгенерирует исключение, говорящее о том, что не хватает памяти. Поэтому я пытаюсь понять, почему и где это происходит, поэтому я поместил различные шаги в моем коде, где я сообщаю об использовании памяти. The problem is that I'm getting very different information based on the method used to get memory usage information:
If I use the method explained here which asks FastMM directly for both the Client EXE and Server DLL, here is what I get:
- STEP 1: [client] = 36664572 - [server] = 3274976
- STEP 2: [client] = 62641230 - [server] = 44430224
- STEP 3: [client] = 66665630 - [server] = 44430224
Now if I use the method explained here which uses GetProcessMemoryInfo, I get far more memory usage:
- STEP 1: [process] = 133722112
- STEP 2: [process] = 1072115712
- STEP 3: [process] = 1075818496
It looks like second method is the right based on my memory problems but how could the FastMM method be so "low"? And what can explain the difference?
1 ответ
GetProcessMemoryInfo также сообщает о памяти, которая не управляется FastMM, например, память, которая выделяется различными dll-файлами Delphi, которые вы можете вызывать (например, winapi).
Кроме того, FastMM может выделять больше памяти из Windows, которую ваше приложение фактически использует для внутренних структур, фрагментации и объединения.
И, наконец, с помощью GetProcessMemoryInfo вы измеряете размер рабочего набора. Это то, что часть памяти приложения постоянно находится в оперативной памяти, а не в файле подкачки. Он включает в себя нечто большее, чем просто структуры данных и определенно не сопоставим с общим объемом памяти, выделенной приложением. PagefileUsage будет более сопоставимым. Размер рабочего набора почти никогда не является тем, что вы ищете. Смотрите здесь для лучшего объяснения.
Таким образом, они оба дают разные результаты, потому что они оба измеряют разные вещи.