Как узнать, какой объем памяти я использую в процессе? Win32 C ++ - PullRequest
1 голос
/ 01 октября 2009

я использую Win32 C ++ в CodeGear Builder 2009 Цель - Windows XP Embedded.

Я нашел структуру PROCESS_MEMORY_COUNTERS_EX и я создал функцию SIPLE, чтобы вернуть Потребление памяти моего процесса

SIZE_T TForm1::ProcessPrivatBytes( DWORD processID )
{
  SIZE_T lRetval = 0;
  HANDLE hProcess;
  PROCESS_MEMORY_COUNTERS_EX pmc;

  hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION |
                              PROCESS_VM_READ,
                              FALSE, processID );
  if (NULL == hProcess)
  {
    lRetval = 1;
  }
  else
  {
    if ( GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc)) )
    {
      lRetval = pmc.WorkingSetSize;
      lRetval = pmc.PrivateUsage;
    }

    CloseHandle( hProcess );
  }
   return lRetval;
}
//---------------------------------------------------------------------------

Должен ли я использовать lRetval = pmc.WorkingSetSize; или lRetval = pmc.PrivateUsage;

privateUsage - это то, что я вижу в perfmon. но что это такое WorkingSetSize точно.

И что посмотреть каждый байт, который я выделяю в счетчике, когда выделяю его Это возможно?

1012 * привет *

jvdn

1 Ответ

4 голосов
/ 01 октября 2009

Это гораздо более сложный вопрос, чем вы, возможно, поняли. Причина в том, что Windows разделяет большую часть исполняемого кода между процессами (особенно теми, которые составляют большую часть самой Windows) между процессами. Например, в память обычно загружается ОДНА копия kernel32.dll, но она обычно отображается в каждом процессе. Считаете ли вы ту часть памяти, которую ваш процесс "использует" или нет?

Частная память - это то, что уникально для этого конкретного процесса. Это тоже может вводить в заблуждение. Поскольку исполняемый файл для вашего процесса может потенциально использоваться совместно с другим процессом (т. Е. Могут запускаться два экземпляра вашей программы), это не считается частью частной памяти, даже если (как это часто бывает) существует только один его экземпляр работает.

Размер рабочего набора составляет около 99,999% бессмысленно. Он возвращает то, что было установлено в качестве предпочтительного размера рабочего набора для процесса. Вы можете настроить это с помощью SetProcessWorkingSetSize (). В Windows есть триммер рабочего набора, который пытается обрезать рабочие наборы. Если память служит, он использует размер рабочего набора, чтобы угадать, стоит ли пытаться обрезать рабочий набор этого процесса - то есть, если его текущий рабочий набор больше, чем был установлен размер рабочего набора, он пытается обрезать его , В противном случае он (в основном) оставляет его в покое.

Скорее всего, ничто из того, что вы делаете, не покажет вам когда-либо выделенный вами байт. Вызов Windows для выделения памяти выполняется довольно медленно, поэтому обычно выполняется то, что библиотека времени выполнения выделяет довольно большой кусок памяти из Windows. Когда вы выделяете память, библиотека времени выполнения дает вам этот большой кусок. Только когда этот кусок исчез, он возвращается в Windows и просит больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...