메모리 스냅샷과 Memory Inspector - ABAP 메모리 분석하기

메모리 스냅샷과 Memory Inspector 배너

왜 ABAP 메모리를 들여다보나

성능 문제라고 하면 대개 "느리다"를 떠올리지만, 메모리가 원인인 경우가 따로 있습니다. 대표적인 신호는 이렇습니다.

  • 메모리 관련 덤프가 난다TSV_TNEW_PAGE_ALLOC_FAILED 처럼 내부 테이블에 더 이상 공간을 못 잡는 덤프
  • 처리 건수가 늘어나면 급격히 무거워진다 — 1천 건은 되는데 10만 건에서 죽는다
  • 오래 돌수록 느려진다 — 시작할 땐 괜찮은데 시간이 갈수록 처짐

특히 세 번째가 전형적인 메모리 누수 패턴입니다. 루프를 돌면서 무언가가 계속 쌓이는데, 아무도 그걸 비우지 않는 상황입니다.

이럴 때 SAT로 시간만 재면 원인이 안 보입니다. 메모리를 직접 찍어봐야 합니다.

메모리 스냅샷이란

특정 시점에 ABAP 세션이 메모리를 어떻게 쓰고 있는지 파일로 남긴 것입니다. 사진을 찍는 것과 같습니다.

중요한 건 스냅샷 한 장만으로는 알 수 있는 게 적다는 점입니다. 두 장을 찍어서 비교할 때 비로소 "무엇이 얼마나 늘었는가"가 보입니다. 이 글의 핵심도 거기에 있습니다.

스냅샷 만드는 방법 두 가지

방법 1신규 ABAP 디버거에서

디버거로 멈춘 정확히 그 지점에서 스냅샷을 만듭니다. 원하는 코드 라인 기준으로 찍을 수 있어 정밀합니다.

방법 2커맨드 필드에 /hmusa

화면 상단 커맨드 필드에 /hmusa 를 입력합니다. 디버거를 띄우지 않고 지금 이 순간을 간편하게 찍습니다.

언제 어느 쪽을 쓰나

  • 재현 가능한 코드 구간이 특정되어 있다 → 디버거. 브레이크포인트를 걸고 전/후로 두 번 찍습니다.
  • 화면을 조작하다가 무거워지는 걸 확인하고 싶다/hmusa. 조작 전후로 두 번 찍습니다.
WARNING

/hmusa 같은 커맨드 코드와 디버거 메뉴 경로는 릴리스에 따라 다를 수 있습니다. 동작하지 않으면 실제 시스템에서 확인하세요.

Memory Inspector로 열어보기

찍은 스냅샷은 S_MEMORY_INSPECTOR 에서 봅니다.

이름이 길어서 매번 치기 번거로운데, SMI로도 같은 프로그램이 열립니다. 실무에서는 이쪽이 훨씬 편합니다.

정식 T-CodeS_MEMORY_INSPECTOR

문서와 SAP 자료에 주로 등장하는 이름입니다.

짧은 T-CodeSMI

같은 프로그램으로 연결됩니다. 앞글자를 딴 것으로 외우면 기억하기 쉽습니다.

트랜잭션을 실행하면 저장된 스냅샷 목록이 나오고, 원하는 것을 골라 내용을 확인할 수 있습니다.

주로 보게 되는 것은 다음입니다.

구분내용
랭킹 리스트메모리를 많이 차지하는 순서대로 정렬된 목록
객체 유형별 분류내부 테이블 / 문자열 / 오브젝트 인스턴스 등으로 묶어서 보기
프로그램별 분류어느 프로그램에 속한 데이터가 메모리를 쓰고 있는지
INFO

Memory Inspector는 메모리를 **"이 객체에 직접 묶인 양"**과 **"이 객체가 참조하는 것까지 합친 양"**으로 나누어 보여줍니다. 오브젝트가 다른 오브젝트를 참조하는 구조에서는 두 값이 크게 다를 수 있으니, 어느 쪽을 보고 있는지 확인하세요.

두 스냅샷 비교하기

여기가 이 도구의 진짜 쓸모입니다.

Memory Inspector에서 스냅샷 두 개를 선택하고 비교(Compare) 를 실행하면, 두 시점 사이의 차이를 보여줍니다.

STEP 1처리 전 스냅샷기준점
STEP 2의심 로직 실행루프 · 대량 처리
STEP 3처리 후 스냅샷비교 대상
STEP 4비교 실행증가분 확인

무엇을 의심하나

정상처리 후 원래대로 돌아온다

처리 중에는 늘었다가 끝난 뒤 기준점 수준으로 회복됩니다. 쓰고 반납하는 정상적인 흐름입니다.

!의심처리가 끝났는데 줄지 않는다

더 이상 쓰지 않는데도 메모리가 잡혀 있다면 누군가 계속 참조를 붙들고 있다는 뜻입니다. 누수를 의심합니다.

증가분 상위에 무엇이 있느냐에 따라 방향이 갈립니다.

  • 내부 테이블이 상위 → 루프에서 APPEND만 하고 비우지 않는 구조를 찾습니다. 전건을 한 번에 담고 있다면 SQL 튜닝 ⑥편의 나눠 읽기가 답이 될 수 있습니다.
  • 오브젝트 인스턴스가 상위 → 객체를 계속 생성하면서 참조를 어딘가(테이블·속성)에 쌓고 있는지 봅니다.
  • 문자열이 상위 → 문자열 누적 연산이 반복되는 지점을 봅니다.

실전 흐름

정리하면 이런 순서입니다.

  1. 문제 재현이 가능한 최소 시나리오를 만듭니다. (전체 배치 말고, 의심 로직만 도는 테스트 프로그램)
  2. 처리 직전에 스냅샷을 찍습니다.
  3. 의심 로직을 여러 번 반복 실행합니다. 누수는 반복해야 티가 납니다.
  4. 처리 직후 스냅샷을 다시 찍습니다.
  5. 두 스냅샷을 비교해 증가분 상위를 확인합니다.
  6. 해당 객체를 참조하는 지점을 소스에서 추적합니다.
TIP

3번의 **"여러 번 반복"**이 핵심입니다. 한 번만 돌리면 정상적인 사용량과 누수를 구분하기 어렵습니다. 같은 로직을 10번, 100번 돌렸을 때 증가분이 비례해서 커진다면, 누수가 맞습니다.

주의사항

  • 스냅샷 생성 자체가 부하입니다. 세션 메모리가 클수록 오래 걸리고 파일도 커집니다. 운영계에서는 신중하게 쓰세요.
  • 파일이 쌓입니다. 분석이 끝난 스냅샷은 정리하는 편이 좋습니다.
  • 권한이 필요할 수 있습니다. 열리지 않으면 권한 문제인지 먼저 확인하세요.
  • 메모리 파라미터는 Basis 영역입니다. 스냅샷으로 "우리 프로그램이 이만큼 쓴다"까지는 개발자가 밝힐 수 있지만, 시스템 메모리 설정 조정은 Basis와 협의할 사안입니다.

정리

상황도구
프로그램이 느리다SAT
SQL이 느리다ST05
DB 전체가 무겁다ST04 · DBA Cockpit
메모리 덤프가 난다 / 돌수록 무거워진다/hmusa 스냅샷 + SMI(Memory Inspector)

기억할 것은 두 가지입니다. 스냅샷은 두 장을 찍어 비교할 때 의미가 생긴다는 것, 그리고 누수 판별은 반복 실행으로 한다는 것입니다.

INFO

커맨드 코드·메뉴 경로·화면 항목 명칭은 릴리스에 따라 다를 수 있습니다. 실제 시스템에서 확인하세요.

Disclaimer — 이 포스트는 AI(Claude)를 활용하여 작성된 초안을 바탕으로 검수 및 보완하여 작성되었습니다. 내용 중 오류나 오타가 있다면 댓글로 알려주시면 감사하겠습니다.