Winapi 如何知道进程中使用了多少内存?Win32 C++

Winapi 如何知道进程中使用了多少内存?Win32 C++,winapi,Winapi,我正在使用 Win32 C++在 CodeGear Builder 2009 目标是嵌入式Windows XP 我找到了进程\内存\计数器\结构 我创建了一个siple函数来返回 进程的内存消耗 SIZE_T TForm1::ProcessPrivatBytes( DWORD processID ) { SIZE_T lRetval = 0; HANDLE hProcess; PROCESS_MEMORY_COUNTERS_EX pmc; hProcess = OpenProc

我正在使用 Win32 C++在 CodeGear Builder 2009 目标是嵌入式Windows XP

我找到了进程\内存\计数器\结构 我创建了一个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

私人用途是我在perfmon中看到的。 但那到底是什么呢

当我分配每个字节时,我想在计数器中看到它。这可能吗

问候


这是一个比你可能意识到的更难的问题。原因是Windows在进程之间共享大部分可执行代码,尤其是在进程之间共享构成Windows自身大部分的代码。例如,通常有一个kernel32.dll副本加载到内存中,但它通常会映射到每个进程中。你认为你的进程使用的内存的一部分吗?< /P> 专用内存是该特定进程所独有的。这也可能有点误导。由于您的进程的可执行文件可能与另一个进程共享,即您的程序的两个实例可以运行,因此这不算作私有内存的一部分,即使通常只有一个实例在运行

工作集大小约为99.999%。它返回的是已设置为进程首选工作集大小的内容。您可以使用SetProcessWorkingSetSize进行调整。Windows有一个工作集修剪器,可尝试修剪工作集。如果内存可用,它将使用工作集大小来猜测是否值得尝试修剪此进程的工作集-即,如果其当前工作集大于设置的工作集大小,它将尝试修剪它。除此之外,它基本上不去管它


很有可能,您所做的任何事情都不会显示您在分配时分配的字节。调用Windows来分配内存相当慢,因此通常情况下运行时库会从Windows分配相当大的内存块。当你分配内存时,运行时库会给你一大块内存。只有当这部分内容消失后,它才会返回Windows并提出更多要求。

这是一个比你可能意识到的更难的问题。原因是Windows在进程之间共享大部分可执行代码,尤其是在进程之间共享构成Windows自身大部分的代码。例如,通常有一个kernel32.dll副本加载到内存中,但它通常会映射到每个进程中。你认为你的进程使用的内存的一部分吗?< /P> 专用内存是该特定进程所独有的。这也可能有点误导。由于您的进程的可执行文件可能与另一个进程共享,即您的程序的两个实例可以运行,因此这不算作私有内存的一部分,即使通常只有一个实例在运行

工作集大小约为99.999%。它返回的是已设置为进程首选工作集大小的内容。您可以使用SetProcessWorkingSetSize进行调整。Windows有一个工作集修剪器,可尝试修剪工作集。如果内存可用,它将使用工作集大小来猜测是否值得尝试修剪此进程的工作集-即,如果其当前工作集大于设置的工作集大小,它将尝试修剪它。除此之外,它基本上不去管它

很有可能,您所做的任何事情都不会显示您在分配时分配的字节。调用Windows来分配内存相当慢,因此通常情况下运行时库会从Windows分配相当大的内存块。当你分配内存时,运行时库会给你一大块内存。只有当这一块消失后,它才会回到Windows并要求更多