서버야 아프지마 - 신입 개발자를 위한 윈도우 메모리릭 디버깅

언젠가 필요할지도..

Untitled

Untitled

Untitled

메모리가 모자른 경우는 실제로 물리메모리가 부족한 경우이지만 많은 경우에 가상메모리가 모자란 상황이다.

os 가상메모리

Untitled

Untitled

프로세스 가상 메모리

Untitled

한 프로세스에 할당할 수 있는 논리적인 주소공간

Untitled

(강연당시)마비노기는 32bit 프로세스여서 4GB까지 할당이 가능하다.

Untitled

Untitled

그런데 실제로는 커널모드에서 2GB를 사용하기에 유저모드에서는 2GB밖에안된다.

Untitled

Untitled

Untitled

Untitled

Untitled

실제로 RAM에 올라가있는 메모리 크기

Untitled

페이징까지 이루어진상황(Disk + RAM)

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

스킬창과 관련된 코드를 모두 뒤지면 잡을 수 있다.

그런데 너무 많아서 시간이 오래걸린다.

따라서

Untitled

어디서 메모리가 새는지 찾는게 중요

Untitled

여기서 어디서는 콜스택을 의미

어느 콜스택에서 메모리가 새는지 찾는게 중요

Untitled

  1. 재현전 메모리 할당량을 스냅샷을 찍음

  2. 그 후 스냅샷을 다시 떠서 2번과 비교

이걸 수행하는 툴

Untitled

Untitled

Untitled

Untitled

Untitled

메모리 사용량 자체를 추적하는 용으로도 쓸 수 있음.

Untitled

최근엔 VS에서 메모리 스냅샷 기능을 지원해서 똑같이 할 수 있다.

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

덤프를 활용

Untitled

Untitled

Untitled

Untitled

사이즈 별로 할당횟수를 통계를 내고 가장 많은 횟수가 릭이 날 확률이 높다.

Untitled

Untitled

Untitled

Untitled

48바이트짜리 메모리 할당을 모두 뒤진다

여기서 케이스가 갈리는데

Untitled

Untitled

Untitled

Untitled

주소를 집어넣고 캐스팅을 하면 정보를 알 수 있게된다.

Untitled

메모리 할당 해제 비용이 크기때문에 대부분은 메모리 풀을 사용한다.

Untitled

이때 2.9GB 누수가 스트링 누수였던것

누수된 스트링을 찾는 법

Untitled

할당받은 공간을 모두사용하면 그 위의 공간을 새로 할당받아(커밋) 사용

Untitled

메모리가 할당될수록 주소가 커짐

Untitled

Untitled

이 영역에 써져있는 메모리를 읽어보자.

Untitled

조진케이스

Untitled

Untitled

Untitled

누수 사이즈가 유니크한 경우 4000byte짜리 버퍼 or 380byte짜리 객체 였다하는 경우

해당 함수를 이용하여 같은 사이즈의 객체가 어디서 할당되는지 추적이 가능하다

Untitled

Untitled

Posted 2023-03-09