안녕하세요, 루피입니다.
가상 메모리 시리즈의 마지막 편입니다. 오늘은 이론에 대한 학습이 아닌 메모리를 분석하는 방법에 대해서 정리해보겠습니다. 바로 시작합니다.
1. 가상 메모리 정보를 확인하는 방법
활성 상태 보기 상단 탭에 메모리를 선택해 정보를 확인합니다.
주요 지표
- 메모리 압력 그래프: 현재 시스템의 메모리 가용성을 가장 종합적으로 보여주는 지표입니다.
- 녹색 : 메모리 리소스가 충분합니다.
- 노란색 : 메모리 리소스가 부족해지기 시작하며, 운영체제가 메모리 관리를 시작합니다.
- 빨간색 : 메모리가 부족하여 성능 저하가 발생할 수 있습니다. 이를 해결하기 위해 macOS는 메모리 압축이나 스왑 을 활발하게 사용하게 됩니다.
- 물리적 메모리 : Mac에 장착된 실제 RAM 크기입니다.
- 사용된 메모리 : 현재 사용 중인 총 메모리 양입니다.
- 앱 메모리 : 앱과 그 프로세스들이 사용 중인 메모리입니다.
- 와이어드 메모리 : 운영체제 커널이 핵심 기능을 위해 사용하는 메모리입니다. 이 메모리는 디스크로 스왑(Swap)될 수 없습니다.
- 압축됨 : macOS는 RAM이 부족해질 때, 비활성 상태인 메모리 영역의 데이터를 압축하여 공간을 확보합니다. 디스크 I/O를 사용하는 스왑보다 훨씬 빠르기 때문에 성능에 이점이 있습니다.
- 캐시된 파일 : 현재 캐시된 파일의 크기를 나타냅니다.
- 사용된 스왑 공간 : RAM이 완전히 부족할 때, 메모리의 일부 데이터를 하드 디스크(SSD)로 옮겨놓은(Swap Out) 크기입니다.

더 상세하고 실시간 데이터를 얻고 싶을 때 유용합니다.
- 터미널에 vm_stat를 입력하면 현재까지의 누적 통계를 보여줍니다.

- vm_stat 1과 같이 숫자를 주면 해당 초(second) 간격으로 변하는 통계를 보여줍니다.
주요 지표
- Pages free : 사용 가능한 유휴 메모리 페이지 수.
- Pages active : 최근 사용되어 활성화된 메모리 페이지 수.
- Pages inactive : 사용되었지만 현재는 활성화되지 않은, 압축 또는 스왑 대상이 될 수 있는 페이지 수.
- Pages wired down : 와이어드 메모리(절대 스왑 불가) 페이지 수.
- Pageins / Pageouts : 메모리와 디스크(스왑 파일) 간의 데이터 이동량. Pageouts이 지속적으로 높게 나타난다면 메모리가 부족하여 디스크 스왑이 활발히 일어나고 있다는 신호이며, 성능 저하의 직접적인 원인입니다.
터미널에 top을 입력합니다.
주요 지표
- PhysMem (물리 메모리 사용량)
- MemRegions (메모리 영역 정보)
- Swap (스왑 사용량) 등
시스템 전반의 메모리 요약을 볼 수 있습니다.

공유 메모리
공유 메모리는 이름 그대로, 여러 프로세스가 하나의 특정 메모리 영역을 함께 공유하여 사용하는 기법입니다.
- 목적 : 프로세스 간 통신(IPC)을 효율적으로 하기 위함입니다. 각자 독립된 메모리 공간을 가진 프로세스들이 데이터를 빠르고 쉽게 주고받을 수 있는 통로 역할을 합니다.
- 동작 방식
- 한 프로세스가 운영체제에 공유 메모리 공간을 할당해달라고 요청합니다.
- 운영체제는 물리적 RAM에 특정 공간을 할당하고, 이 공간에 접근할 수 있는 주소를 제공합니다.
- 이후 다른 프로세스들도 해당 주소를 통해 동일한 메모리 공간에 접근하여 데이터를 읽거나 쓸 수 있습니다.
- 장점 : 데이터를 복사할 필요 없이 같은 공간을 바로 참조하므로, 다른 IPC 방식에 비해 매우 빠릅니다. 대용량 데이터를 주고받을 때 특히 효율적입니다.
- 단점 : 여러 프로세스가 동시에 같은 데이터에 접근할 수 있으므로, 데이터가 꼬이거나 충돌하지 않도록 동기화 문제를 개발자가 직접 신중하게 처리해야 합니다.
스왑 메모리
스왑 메모리는 실제 물리적인 RAM이 부족할 때, 하드 디스크의 일부 공간을 RAM처럼 사용하는 가상 메모리 기술입니다.
- 목적 : 물리적 RAM의 용량을 초과하는 프로그램을 실행하거나, 시스템이 메모리 부족으로 멈추는 것을 방지하기 위함입니다. 즉, RAM의 확장 공간 역할을 합니다.
- 동작 방식
- RAM이 가득 차면, OS는 당장 사용하지 않는 데이터나 비활성 상태인 프로그램의 메모리 영역(페이지)을 찾아냅니다.
- 이 데이터 조각을 디스크에 마련된 특별한 공간, 즉 스왑 공간으로 옮깁니다. (이 과정을 Swap Out이라고 합니다.)
- 이렇게 확보된 RAM 공간에 새로운 데이터를 올립니다.
- 나중에 디스크로 옮겨졌던 데이터가 다시 필요해지면, RAM의 다른 데이터를 디스크로 내보내고 해당 데이터를 다시 RAM으로 불러옵니다. (이 과정을 Swap In 이라고 합니다.)
- 장점 : 물리적인 RAM 용량보다 더 큰 프로그램을 실행할 수 있게 해주고, 시스템 안정성을 높여줍니다.
- 단점 : 디스크는 RAM에 비해 읽고 쓰는 속도가 매우 느리기 때문에, 스왑이 활발하게 일어나면 시스템 전체 성능이 급격히 저하됩니다. (macOS의 '메모리 압박'이 빨간색으로 변하는 주된 원인입니다.)
2. 메모리 분석 명령어 및 프로그램 비교
macOS에서 사용하는 대표적인 메모리 분석 명령어들의 특징을 비교해 보겠습니다. 각 도구는 목적과 제공하는 정보의 깊이가 다릅니다.
| 도구 | 주요 목적 | 범위 | 제공 정보 | 사용 상황 |
| 활성 상태 보기 | 시스템 전반의 메모리 상태를 시각적으로 쉽게 파악 | 시스템 전체 & 프로세스별 | 메모리 압박 그래프, 앱/와이어드/압축 메모리, 스왑 사용량 | 가장 먼저 확인하는 종합적인 대시보드. 비정상적인 상태를 빠르게 감지할 때 유용. |
| top / htop | 실시간으로 시스템 리소스를 많이 사용하는 프로세스 감시 | 시스템 전체 & 프로세스별 | CPU/메모리 점유율, 프로세스 목록, 가상/물리 메모리 크기(VSIZE/RSIZE) | "어떤 앱이 지금 메모리를 많이 쓰고 있지?"를 실시간으로 찾고 싶을 때 사용. |
| vm_stat | 시스템 전체의 가상 메모리활동(특히 페이징/스와핑) 통계 확인 | 시스템 전체 | 페이지 인/아웃, 스왑 인/아웃, 유휴/활성/비활성 페이지 수 | 메모리 부족으로 인한 디스크 I/O 발생 여부 등 시스템 레벨의 메모리 성능을 진단할 때 사용. |
| ps | 특정 시점의 프로세스 상태(스냅샷) 확인 | 프로세스별 | PID, 상태, 메모리 사용량(RSS, VSZ) 등 다양한 정보 | 특정 프로세스의 메모리 사용량을 정적인 상태에서 확인하거나 스크립트에서 활용할 때 유용. |
프로세스의 메모리가 구체적으로 어떻게 구성되어 있는지( Text, Data, Stack, Heap) 분석하려면 다른 방식이 필요합니다.
1) vmmap
vmmap은 특정 프로세스의 가상 메모리 주소 공간을 지도처럼 보여주는 툴입니다.
- 사용법 : vmmap <PID>
- 분석 가능한 정보
- __TEXT : 컴파일된 기계어 코드가 저장되는 영역. 실행 가능(r-x)하지만 쓸 수(w)는 없습니다.
- __DATA : 전역 변수, 정적 변수 등 초기화된 데이터가 저장되는 영역.
- Stack : 함수 호출 시 생성되는 지역 변수, 매개변수, 리턴 주소 등이 저장되는 영역.
- Heap : 동적으로 할당된 메모리. malloc, new 등으로 생성한 객체들이 위치합니다. vmmap 출력에서는 MALLOC_TINY, MALLOC_SMALL, MALLOC_LARGE 와 같은 이름으로 표시됩니다.
- Shared Memory : 다른 프로세스와 공유하는 라이브러리(dylib) 등이 포함된 영역.

2) Xcode Instruments
iOS/macOS 개발자에게 가장 중요한 툴입니다. 위에서 언급한 CLI 도구들의 기능을 훨씬 강력한 UI와 함께 제공합니다.
- VM Tracker : vmmap의 시각화 버전. 프로세스의 가상 메모리 영역을 실시간으로 보여줍니다.
- Allocations : Heap 메모리 할당(malloc, free) 내역을 추적합니다. 어떤 객체가 얼마나 할당되었고, 어떤 코드에서 할당했는지 상세히 볼 수 있습니다.
- Leaks : leaks 명령어의 시각화 버전. 메모리 누수를 실시간으로 탐지하고 원인 코드를 보여줍니다.


오늘도 화이팅입니다!
'CS' 카테고리의 다른 글
| [CS] 파일 시스템에 대해 알아보자 (3) | 2025.07.23 |
|---|---|
| [CS] OOP란 무엇인가? (1) | 2025.07.21 |
| [CS] 가상메모리 동작원리 (2) (0) | 2025.07.20 |
| [CS] 가상 메모리는 왜 필요할까? (1) (0) | 2025.07.20 |
| [CS] Swift로 HashMap 구현하기 (2) | 2025.07.11 |
