2009-10-01 98 views
1

我正在使用 Win32 C++在 CodeGear Builder 2009 目标是Windows XP Embedded。如何知道我在一个进程中使用了多少内存? win32 C++

我发现PROCESS_MEMORY_COUNTERS_EX结构 和我创建了一个赛普尔函数返回我的过程 内存消耗

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;

privateUser是我在perfmon中看到的。 但WorkingSetSize究竟是什么。

我在分配计数器时要查看计数器中分配的每个字节的内容。这可能吗?

问候

jvdn

回答

4

这可能比你实现一个更加强硬的问题。原因在于Windows在进程之间共享进程之间的大部分可执行代码(特别是组成大部分Windows本身的代码)。例如,通常有一份kernel32.dll加载到内存中,但通常会映射到每个进程中。你认为你的过程“使用”或没有记忆的那部分?

私有内存是该特定进程的独特内容。这也可能有些误导。由于您的进程的可执行文件可能会与另一个进程共享(即可以运行两个程序实例),所以不会将其作为私有内存的一部分,即使(通常情况下)只有一个实例运行。

工作集大小约为99.999%毫无意义。它返回的是什么已被设置为该过程的首选工作集大小。您可以使用SetProcessWorkingSetSize()来调整它。 Windows有一个工作集修剪器,试图修剪工作集。如果内存服务,它使用工作集大小来猜测是否值得尝试修剪此进程的工作集 - 即,如果其当前工作集大于工作集大小设置为,它会尝试修剪它。否则,它(大部分)会让它独处。

有可能是你没有做任何事情会显示你分配给你的字节,虽然你分配它。调用Windows来分配内存相当缓慢,所以通常情况下,运行时库会从Windows分配相当大的内存。当你分配内存时,运行时库为你提供了一大块。只有当这个块丢失时,它才会回到Windows并要求更多。

相关问题