2009-10-01 6 views
1

내가 사용하고있다 Win32 C++ in CodeGear Builder 2009 대상은 Windows XP Embedded입니다. 프로세스에서 사용중인 메모리 양을 파악하는 방법은 무엇입니까? win32 C++

내가 찾은 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는 무엇입니까?

나는 그것을 할당 할 때마다 카운터에 할당 할 모든 바이트를 볼 것입니다. 이게 가능하니?

관련

jvdn

답변

4

이것은 당신이 아마 실현보다 훨씬 강하다는 질문이다. 그 이유는 Windows가 프로세스간에 가장 실행 가능한 코드 (대부분 Windows 자체를 구성하는 코드)를 프로세스간에 공유하기 때문입니다. 예를 들어, 일반적으로 kernel32.dll의 복사본 하나가 메모리에로드되지만 일반적으로 모든 프로세스에 매핑됩니다. 당신은 당신의 프로세스가 "사용"하고있는 메모리의 일부분을 고려하고 있습니까?

개인 메모리가 특정 프로세스에 고유합니다. 이것은 다소 오해의 소지가 있습니다. 프로세스의 실행 파일이 잠재적으로 다른 프로세스와 공유 될 수 있기 때문에 (즉, 두 개의 프로그램 인스턴스가 실행될 수 있음), 이는 개인 메모리의 일부로 간주되지 않습니다. 달리는.

작업 세트 크기는 약 99.999 % 의미가 없습니다. 반환 값은 프로세스의 기본 작업 세트 크기로 설정된 값입니다. SetProcessWorkingSetSize()로 조정할 수 있습니다. Windows에는 작업 집합 트리밍을 시도하는 작업 집합 트리머가 있습니다. 메모리가 작동하면 작업 집합 크기를 사용하여이 프로세스의 작업 집합을 다듬을 가치가 있는지 여부를 추측합니다. 즉 현재 작업 집합이 작업 집합 크기보다 큰 경우 작업 집합 크기를 다듬어 봅니다. . 그렇지 않으면 (대부분) 혼자 남겨 둡니다.

할당 할 때마다 할당 한 바이트 수는 아무 것도 표시되지 않을 가능성이 있습니다. Windows를 호출하여 메모리를 할당하는 것은 상당히 느리기 때문에 일반적으로 실행 시간 라이브러리는 Windows에서 상당히 많은 메모리를 할당합니다. 메모리를 할당하면 런타임 라이브러리가 큰 조각을 제공합니다. 그 덩어리가 사라질 때만 Windows로 돌아가서 더 많은 것을 요구합니다.

관련 문제