Winapi 如何知道进程中使用了多少内存?Win32 C++
我正在使用 Win32 C++在 CodeGear Builder 2009 目标是嵌入式Windows XP 我找到了进程\内存\计数器\结构 我创建了一个siple函数来返回 进程的内存消耗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
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并要求更多