서버야 아프지마 - 신입 개발자를 위한 윈도우 메모리릭 디버깅
언젠가 필요할지도..



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


프로세스 가상 메모리

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

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


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





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

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








스킬창과 관련된 코드를 모두 뒤지면 잡을 수 있다.
그런데 너무 많아서 시간이 오래걸린다.
따라서

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

여기서 어디서는 콜스택을 의미
어느 콜스택에서 메모리가 새는지 찾는게 중요

-
재현전 메모리 할당량을 스냅샷을 찍음
-
그 후 스냅샷을 다시 떠서 2번과 비교
이걸 수행하는 툴





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

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







덤프를 활용




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




48바이트짜리 메모리 할당을 모두 뒤진다
여기서 케이스가 갈리는데




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

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

이때 2.9GB 누수가 스트링 누수였던것
누수된 스트링을 찾는 법

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

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


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

조진케이스



누수 사이즈가 유니크한 경우 4000byte짜리 버퍼 or 380byte짜리 객체 였다하는 경우
해당 함수를 이용하여 같은 사이즈의 객체가 어디서 할당되는지 추적이 가능하다


추가로 같이 보면 좋은 자료
- 넷마블 기술블로그 : 워라밸 브레이커, 메모리릭을 찾아라
- https://netmarble.engineering/break-the-memory-leak-1-4/
- https://netmarble.engineering/break-the-memory-leak-2-4/
- https://netmarble.engineering/break-the-memory-leak-3-4/
- https://netmarble.engineering/break-the-memory-leak-4-4/