서버야 아프지마 - 신입 개발자를 위한 윈도우 메모리릭 디버깅
언젠가 필요할지도..
메모리가 모자른 경우는 실제로 물리메모리가 부족한 경우이지만 많은 경우에 가상메모리가 모자란 상황이다.
os 가상메모리
프로세스 가상 메모리
한 프로세스에 할당할 수 있는 논리적인 주소공간
(강연당시)마비노기는 32bit 프로세스여서 4GB까지 할당이 가능하다.
그런데 실제로는 커널모드에서 2GB를 사용하기에 유저모드에서는 2GB밖에안된다.
실제로 RAM에 올라가있는 메모리 크기
페이징까지 이루어진상황(Disk + RAM)
스킬창과 관련된 코드를 모두 뒤지면 잡을 수 있다.
그런데 너무 많아서 시간이 오래걸린다.
따라서
어디서 메모리가 새는지 찾는게 중요
여기서 어디서는 콜스택을 의미
어느 콜스택에서 메모리가 새는지 찾는게 중요
-
재현전 메모리 할당량을 스냅샷을 찍음
-
그 후 스냅샷을 다시 떠서 2번과 비교
이걸 수행하는 툴
메모리 사용량 자체를 추적하는 용으로도 쓸 수 있음.
최근엔 VS에서 메모리 스냅샷 기능을 지원해서 똑같이 할 수 있다.
덤프를 활용
사이즈 별로 할당횟수를 통계를 내고 가장 많은 횟수가 릭이 날 확률이 높다.
48바이트짜리 메모리 할당을 모두 뒤진다
여기서 케이스가 갈리는데
주소를 집어넣고 캐스팅을 하면 정보를 알 수 있게된다.
메모리 할당 해제 비용이 크기때문에 대부분은 메모리 풀을 사용한다.
이때 2.9GB 누수가 스트링 누수였던것
누수된 스트링을 찾는 법
할당받은 공간을 모두사용하면 그 위의 공간을 새로 할당받아(커밋) 사용
메모리가 할당될수록 주소가 커짐
이 영역에 써져있는 메모리를 읽어보자.
조진케이스
누수 사이즈가 유니크한 경우 4000byte짜리 버퍼 or 380byte짜리 객체 였다하는 경우
해당 함수를 이용하여 같은 사이즈의 객체가 어디서 할당되는지 추적이 가능하다