VMMap

VMMap프로세스가상 메모리를 분석하는 Sysinternals 유틸리티 프로그램이다.

VMMap 유틸리티 프로그램

본 프로그램을 이해하려면 윈도우 NT 운영체제를 컴퓨터 구조론 관점에서의 개념이 확립되어야 한다.

VMMap은 선택된 단 하나의 프로세스에서 커널 공간을 제외한 가상 주소 공간, 즉 사용자 공간을 어떻게 사용하고 있는지 보여준다. 만일 64비트 프로세스라면 128 TB(윈도우 서버 2012까지는 8 TB)의 사용자 공간이 VMMap에 표시된다. 아래는 창 상단에 위치한 세 개의 그래프가 각각 무엇을 의미하는지 설명한다.

그래프설명
커밋 요약 그래프
(Commit Summary Graph)
메모리 유형마다 프로세스의 가상 주소 공간에 할당된 커밋된 용량을 표시한다. 즉, 여유(free) 및 예약된(reserved) 페이지를 제외한 오로지 커밋된 페이지만이 계산된 수치이다.
개인 요약 그래프
(Private Summary Graph)
커밋된 메모리 중에서 공유되지 않은 프로세스 개인만을 위한 용량을 표시한다. 성능 카운터: \Process(*)\Private Bytes
워킹 세트 요약 그래프
(Working Set Summary Graph)
커밋된 메모리 중에서 RAM에 상주하고 있는 워킹 세트 용량을 표시한다. 성능 카운터: \Process(*)\Working Set

그래프에 표시된 각 색상들은 메모리 유형들을 나타내며, 이들에 대한 수치적 정보는 그래프 아래에 위치한 두 개의 도표들로부터 확인할 수 있다.

  • 요약 항목(Summary View): 메모리 유형마다 가상 주소 공간에서 확보된 용량을 나열한다.
  • 상세 항목(Details View): 프로세스 가상 주소 공간에 상주하는 메모리 영역들을 순서대로 보여준다.

메모리 유형

다음은 VMMap에서 다루는 메모리 유형들을 소개한다.

  • 여유(Free)

    프로세스 가상 주소 공간에서 커밋으로 할당되지 않은 영역이다. 커밋 요약 그래프에는 사용 불가한(unusable)과 함께 표시되지 않는 메모리 유형이다.

  • 개인(Private)

    윈도우 APIVirtualAlloc 함수로부터 할당되어 다른 프로세스와 공유될 수 없는 메모리이다. 커밋 한도에 의한 크기 제한이 있으며, 일반적으로 어플리케이션 데이터를 저장한다.

    힙 메모리 관리자 또는 .NET 런타임으로부터 할당된 메모리는 별도 메모리 유형으로 분류된다.

    아래는 개인 메모리에 속하는 하위 유형의 메모리들을 소개한다:

개인 메모리설명

(Heap)
힙 관리자(Heap Manager)로부터 관리되며, 흔히 C 런타임 라이브러리(CRT)의 malloc 또는 윈도우 API의 HeapAllocLocalAlloc 등으로 할당받는다.
관리된 힙
(Managed Heap)
.NET 가비지 컬렉터(garbage collector)로부터 할당 및 사용되는 메모리이다.
스택
(Stack)
개별 스레드마다 함수의 매개변수, 변수, 그리고 함수의 호출이 기록되하며 필요에 따라 용량이 커질 수 있다.
페이지 테이블
(Page Table)
프로세스의 페이지 정보를 관리하는 커널 모드의 워킹 세트 메모리이다.
  • 공유 가능한(Shareable)

    개인 메모리와 달리, 타 프로세스에서도 함께 사용될 수 있으며 (만일 존재한다면) 페이징 파일에 상주한다. 일반적으로 다른 프로세스에 상주하는 DLL에 공유되는 데이터 혹은 프로세스 간 통신 메시지를 저장한다. 개인 메모리와 마찬가지로, 커밋 한도에 의해 메모리 크기가 제한받는다.

    윈도우 API에서는 해당 유형의 메모리를 “페이징 파일로부터 데이터 공유를 지원받는 메모리 섹션(pagefile-backed section)”이라 언급한다.

    아래는 공유 가능한 메모리에 속하는 하위 유형의 메모리들을 소개한다:

공유 가능한 메모리설명
매핑된 파일
(Mapped File)
디스크에 있는 파일들을 나태낸 메모리이다. 상세 항목에서 해당 파일의 경로를 확인할 수 있다.
  • 이미지(Image)

    이미지 로더(image loader)에 의해 프로세스 가상 주소 공간에 올라간 .EXE 또는 .DLL 등의 확장자를 갖는 실행 파일이 저장되는 메모리이며, 그 안에는 프로그램 이미지 코드와 같은 공유 가능한 메모리도 포함될 수 있다. 허나, 단순히 데이터 파일로써 가상 주소 공간에 매핑된 이미지는 공유 가능한(shareable) 메모리에 속한다. 상세 항목에서 프로그램 이미지가 위치한 파일 경로를 확인할 수 있다.

    만일 초기화 정보 등의 일부 이미지 메모리 영역에 변동사항이 생길 시, 이미지 메모리를 수정하는 게 아니라 개인 메모리를 생성하여 수정된 내용을 기록한다.

문자열 메모리

간혹 메모리에 저장된 문자열로부터 해당 메모리 영역이 어떠한 목적으로 사용되고 있는지 파악할 수 있다. VMMap은 창 메뉴에서 View → Strings 선택지(단축키: CTRL+T)를 클릭하여 세 개 이상의 문자로 구성된 ASCII 혹은 유니코드 문자열을 확인할 수 있다.