일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- AppSW
- Specular
- 프로그래밍 기초
- Rim Light
- 게임 수학
- Toon Shader
- 메모리 누수
- ASW(Application SpaceWarp)
- ColorGradingLutPass
- URP로 변경
- URP
- Cartoon Rendering
- C언어
- Cell Look
- Virtual Byte
- OculusMotionVectorPass
- Private Bytes
- VR
- working set
- Cell Shader
- 벡터
- 가상 바이트
- 개인 바이트
- 작업 집합
- Three(Two) Tone Shading
- Windows Build
- 3d
- Today
- Total
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이란 이름이 붙은 이유)
반드시 실제로 사용 중인 사이즈는 아니다
또한 개인 바이트는 하드 디스크에 적재된 페이지도 포함하므로 물리적인 메모리만 있는 것도 아니다
정리하자면 개인 바이트는 프로세스에 실제로 할당한 값과 페이지 파일 사용량을 합한 값이라고 할 수 있다
메모리 누수 찾기
작업 집합, 가상 바이트, 개인 바이트의 어느 것도 실행 파일이 실제로 사용하고 있는
메모리 양을 나타내는 것이 아니기에 한가지 지표만으로는 메모리 누수 디버깅에 적절하지 않다
반대로 말하자면, 메모리 누수를 찾기 위해서는 모든 지표를 모니터링할 필요가 있다는 뜻이기도 하다
일부 메모리 누수는 개인 바이트의 증가로 데이터 파일에 표시된다
다른 메모리 누수는 가상 주소 공간의 증가로 표시된다
메모리 정보를 얻는 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://wnsgml972.github.io/c/2020/02/15/c_memory_leak/
https://www.slideshare.net/seao/ndc18-95258747
https://post.naver.com/viewer/postView.nhn?volumeNo=14962388&memberNo=559061
http://www.yes24.com/Product/Goods/66816029
SSS
'게임 프로그래밍(학습 내용 정리) > 시스템 프로그래밍' 카테고리의 다른 글
Dynamic-Link Library(DLL) (0) | 2022.05.23 |
---|---|
어플리케이션에서 가상 메모리 사용 방법 (0) | 2022.05.23 |
메모리 (0) | 2022.05.16 |
동기화 방법들 (0) | 2022.04.08 |
유저 모드에서의 스레드 동기화 (0) | 2022.03.29 |