성능 문제라고 하면 대개 "느리다"를 떠올리지만, 메모리가 원인인 경우가 따로 있습니다. 대표적인 신호는 이렇습니다.
TSV_TNEW_PAGE_ALLOC_FAILED 처럼 내부 테이블에 더 이상 공간을 못 잡는 덤프특히 세 번째가 전형적인 메모리 누수 패턴입니다. 루프를 돌면서 무언가가 계속 쌓이는데, 아무도 그걸 비우지 않는 상황입니다.
이럴 때 SAT로 시간만 재면 원인이 안 보입니다. 메모리를 직접 찍어봐야 합니다.
특정 시점에 ABAP 세션이 메모리를 어떻게 쓰고 있는지 파일로 남긴 것입니다. 사진을 찍는 것과 같습니다.
중요한 건 스냅샷 한 장만으로는 알 수 있는 게 적다는 점입니다. 두 장을 찍어서 비교할 때 비로소 "무엇이 얼마나 늘었는가"가 보입니다. 이 글의 핵심도 거기에 있습니다.
디버거로 멈춘 정확히 그 지점에서 스냅샷을 만듭니다. 원하는 코드 라인 기준으로 찍을 수 있어 정밀합니다.
/hmusa화면 상단 커맨드 필드에 /hmusa 를 입력합니다. 디버거를 띄우지 않고 지금 이 순간을 간편하게 찍습니다.
/hmusa. 조작 전후로 두 번 찍습니다.
/hmusa 같은 커맨드 코드와 디버거 메뉴 경로는 릴리스에 따라 다를 수 있습니다. 동작하지 않으면 실제 시스템에서 확인하세요.
찍은 스냅샷은 S_MEMORY_INSPECTOR 에서 봅니다.
이름이 길어서 매번 치기 번거로운데, SMI로도 같은 프로그램이 열립니다. 실무에서는 이쪽이 훨씬 편합니다.
S_MEMORY_INSPECTOR문서와 SAP 자료에 주로 등장하는 이름입니다.
SMI같은 프로그램으로 연결됩니다. 앞글자를 딴 것으로 외우면 기억하기 쉽습니다.
트랜잭션을 실행하면 저장된 스냅샷 목록이 나오고, 원하는 것을 골라 내용을 확인할 수 있습니다.
주로 보게 되는 것은 다음입니다.
| 구분 | 내용 |
|---|---|
| 랭킹 리스트 | 메모리를 많이 차지하는 순서대로 정렬된 목록 |
| 객체 유형별 분류 | 내부 테이블 / 문자열 / 오브젝트 인스턴스 등으로 묶어서 보기 |
| 프로그램별 분류 | 어느 프로그램에 속한 데이터가 메모리를 쓰고 있는지 |
Memory Inspector는 메모리를 **"이 객체에 직접 묶인 양"**과 **"이 객체가 참조하는 것까지 합친 양"**으로 나누어 보여줍니다. 오브젝트가 다른 오브젝트를 참조하는 구조에서는 두 값이 크게 다를 수 있으니, 어느 쪽을 보고 있는지 확인하세요.
여기가 이 도구의 진짜 쓸모입니다.
Memory Inspector에서 스냅샷 두 개를 선택하고 비교(Compare) 를 실행하면, 두 시점 사이의 차이를 보여줍니다.
처리 중에는 늘었다가 끝난 뒤 기준점 수준으로 회복됩니다. 쓰고 반납하는 정상적인 흐름입니다.
더 이상 쓰지 않는데도 메모리가 잡혀 있다면 누군가 계속 참조를 붙들고 있다는 뜻입니다. 누수를 의심합니다.
증가분 상위에 무엇이 있느냐에 따라 방향이 갈립니다.
APPEND만 하고 비우지 않는 구조를 찾습니다. 전건을 한 번에 담고 있다면 SQL 튜닝 ⑥편의 나눠 읽기가 답이 될 수 있습니다.정리하면 이런 순서입니다.
3번의 **"여러 번 반복"**이 핵심입니다. 한 번만 돌리면 정상적인 사용량과 누수를 구분하기 어렵습니다. 같은 로직을 10번, 100번 돌렸을 때 증가분이 비례해서 커진다면, 누수가 맞습니다.
| 상황 | 도구 |
|---|---|
| 프로그램이 느리다 | SAT |
| SQL이 느리다 | ST05 |
| DB 전체가 무겁다 | ST04 · DBA Cockpit |
| 메모리 덤프가 난다 / 돌수록 무거워진다 | /hmusa 스냅샷 + SMI(Memory Inspector) |
기억할 것은 두 가지입니다. 스냅샷은 두 장을 찍어 비교할 때 의미가 생긴다는 것, 그리고 누수 판별은 반복 실행으로 한다는 것입니다.
커맨드 코드·메뉴 경로·화면 항목 명칭은 릴리스에 따라 다를 수 있습니다. 실제 시스템에서 확인하세요.
Disclaimer — 이 포스트는 AI(Claude)를 활용하여 작성된 초안을 바탕으로 검수 및 보완하여 작성되었습니다. 내용 중 오류나 오타가 있다면 댓글로 알려주시면 감사하겠습니다.