WinCNT

작업 집합(Working Set), 가상 바이트(Virtual Byte), 개인 바이트(Private Bytes)...그리고 메모리 누수 본문

게임 프로그래밍(학습 내용 정리)/시스템 프로그래밍

작업 집합(Working Set), 가상 바이트(Virtual Byte), 개인 바이트(Private Bytes)...그리고 메모리 누수

WinCNT_SSS 2022. 5. 16. 15:47

작업 집합(Working Set)

작업 집합은 프로세스에서 사용하는 총 물리적 메모리(RAM)을 나타내며,

프로세스의 스레드가 최근에 사용한 적이 있는 메모리 페이지 집합을 뜻한다

(작업 집합은 메모리에 매핑된 파일과 리소스도 포함)

 

작업 집합은 작업 관리자의 메모리 사용량에 모니터링되는 값과 동일하다

 

작업 집합의 메모리 페이지는 사용된 적이 있다는 것이지 현재 메모리에 로드되어 있다 뜻은 아니다(!)

컴퓨터의 여유 메모리가 임계값보다 높으면

사용 중인 아니더라도 메모리 페이지는 작업 집합에 남아있다

 

정리하자면 작업 집합은 페이징되지 않은 개인 바이트와, 메모리 매핑된 파일이라고 할 수 있다

 

가상 바이트(Virtual Byte)

가상 바이트는 프로세스가 차지하는 총 가상 주소 공간이다

가상 바이트는 작업 집합과 마찬가지로 메모리 매핑된 파일(공유 DLL)을 포함하지만

대기 목록(Stanby List)의 데이터와 이미 페이지 아웃되어 디스크에 있는 데이터도 포함된다

 

가상 주소 공간을 사용한다고해서 반드시 디스크나 기본 메모리 페이지를 사용하는 것은 아니다

가상 공간은 유한하며 프로세스는 라이브러리를 로드하는 기능을 제한 할 수 있다

 

로드가 많은 시스템의 모든 프로세스에서 사용하는 총 가상 바이트는

머신의 실제 메모리보다 훨씬 많은 메모리를 필요로 한다

 

정리하자면 가상 바이트는 작업 집합 + 페이징된 개인 바이트 + 대기 목록(Stanby List)이라 할 수 있다

 

개인 바이트(Private Bytes)

개인 바이트는 프로세스가 요청한, 다른 프로세스와 공유할 수 없는 현재 메모리 크기이다

일반적으로 메모리 매핑 파일(공유 DLL)은 제외하기 때문에(Private이란 이름이 붙은 이유)
반드시 실제로 사용 중인 사이즈는 아니다

또한 개인 바이트는 하드 디스크에 적재된 페이지도 포함하므로 물리적인 메모리만 있는 것도 아니다

정리하자면 개인 바이트는 프로세스에 실제로 할당한 값과 페이지 파일 사용량을 합한 값이라고 할 수 있다


메모리 누수 찾기

작업 집합, 가상 바이트, 개인 바이트의 어느 것도 실행 파일이 실제로 사용하고 있는
메모리 양을 나타내는 것이 아니기에 한가지 지표만으로는 메모리 누수 디버깅에 적절하지 않다

반대로 말하자면, 메모리 누수를 찾기 위해서는 모든 지표를 모니터링할 필요가 있다는 뜻이기도 하다

 

일부 메모리 누수는 개인 바이트의 증가로 데이터 파일에 표시된다

다른 메모리 누수는 가상 주소 공간의 증가로 표시된다

 

https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/using-performance-monitor-to-find-a-user-mode-memory-leak

 

Using Performance Monitor to Find a User-Mode Memory Leak - Windows drivers

Using Performance Monitor to Find a User-Mode Memory Leak

docs.microsoft.com

 

메모리 정보를 얻는 API

    HANDLE hProcess;
    PROCESS_MEMORY_COUNTERS pmc;
    
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
        PROCESS_VM_READ,
        FALSE, processID);
    if (NULL == hProcess)
        return;

    if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)))
    {
        pmcList.push_back(pmc);
    }

 

https://docs.microsoft.com/en-us/windows/win32/psapi/collecting-memory-usage-information-for-a-process

 

Collecting Memory Usage Information For a Process - Win32 apps

To determine the efficiency of your application, you may want to examine its memory usage. The following sample code uses the GetProcessMemoryInfo function to obtain information about the memory usage of a process.

docs.microsoft.com

https://wnsgml972.github.io/c/2020/02/15/c_memory_leak/

 

Windows WinDBG, UMDH로 Memory Leak 잡기

Catch Memory Leak with Windows WinDBG 목차 Memory Leak을 잡기 위한 여러 도구들이 있지만, 생각보다 접근성이 쉽지 않거나, 원하는 프로세스를 찾지 못하는 문제가 있었습니다. 그렇기 때문에 본 게시글에

wnsgml972.github.io

https://www.slideshare.net/seao/ndc18-95258747

 

[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅

NDC 2018 서버야, 아프지마 - 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅

www.slideshare.net

https://post.naver.com/viewer/postView.nhn?volumeNo=14962388&memberNo=559061 

 

메모리 누수 잡아버리기

[BY MastProgs] 언제부터 누수됐는지 모른다. 어디서 누수가 된지도 모른다. 다만 남다른 재주는 있지. ...

m.post.naver.com

http://www.yes24.com/Product/Goods/66816029

 

Windows Debugging 2/e - YES24

윈도우에서 WinDbg를 이용해 디버깅하는 방법을 중점적으로 설명한 책으로 최신 윈도우 10까지 내용을 수록했다. 윈도우 디버깅 전문가들인 저자들이 현장에서 우러난 실전 경험을 바탕으로 한

www.yes24.com

 

SSS