SAP Memory Inspector(메모리 검사기) 는 ABAP 프로그램이 실행되는 내부 세션에서 사용되는 메모리를 확인하고, 분석할 수 있게 도와주는 SAP Standard Tool 이다.
메모리 검사기를 통해서 다음과 같은 사항들을 확인할 수 있다.
ABAP 프로그램에서 직접적으로 사용하는 메모리 소비량
ABAP 프로그램의 Static, Dynamic Memory Object 와 ABAP Stack 에서 사용하는 메모리를 확인할 수 있다.
내부 세션 전체의 OS 단 메모리 할당량
ABAP 메모리 소비와 ABAP Runtime 및 내부 세션 관리에서 사용하는 모든 메모리를 확인할 수 있다.
ABAP 프로그램이 사용하는 내부 세션 메모리 분석을 위해서는 Memory Inspector 과 같이 다음 항목도 확인하여 디테일한 정보를 확인할 수 있다.
- RSMEMORY -> 상단 메뉴탭 Goto -> EM/HEAP Areas ->
<사용자 세션 확인>
- SM50 ->
<ABAP 프로그램이 수행중인 Workproccess>
더블 클릭 -> Memory Statistics
Static Memory Object (SMI-Static Variables) 는 소스코드 내 Data Type 선언에 의해 고정된 크기(Predefined) 가 설정된 Object 이다.
Dynamic Memory Object 는 프로그램이 실행될 때 크기가 변경될 수 있으므로, 메모리 관련 문제를 일으킬 가능성이 높다.
Dynamic Memory Object 에는 다음 ABAP Entity 가 포함된다.
Bound Memory 는 SMI-Dominator Tree, Ranking Lists 를 참조한다.
Bound Memory 또는 Bound Storage 는 ABAP 프로그램의 특정 Entity(Class Object, Table, String 등등) 가 삭제되면 해제되는 Main Memory 이다.
Bound Storage 에는 Object 자체에서 사용하는 메모리, Object 가 참조하고 Exclusively(독점적으로) 사용하는 메모리를 포함한다.
ABAP 프로그램은 Internal Table과 Strings 를 연속된 메모리에 저장한다.
이러한 이유로 ABAP 프로그램은 항상 실제로 필요한 것보다 더 많은 스토리지를 이러한 Object 에 할당한다.
따라서, Internal Table 의 새 행이나 Strings 이 길어질 때, 추가 공간이 있다면 효율적으로 증가할 수 있지만, 추가 공간이 없다면 ABAP 프로그램은 Internal Table 이나 Strings 를 더 크고 연속적인 메모리 공간으로 복사한 뒤 추가를 하게 된다.
Allocated Memory(할당된 메모리) 는 일반적으로 Used Memory 보다 크며, Internal Table 이나 Strings 이 지워지거나 삭제될때 해제되는 메모리의 양을 나타낸다.
ABAP Class Object 와 Anonymous Object 는 Strongly Connected Components(SCC) 에 속할 수 있다.
이는 ABAP Class Object 와 Anonymous Object 가 다른 Object 를 참조하는 속성을 가지고 있기 때문이며, 이로 인해 강한 연결 구성요소를 형성한다.
SCC 는 잠재적인 문제점을 내포할 수 있는데, 이는 SCC 가 여러 참조로 불필요하게 많은 Memory 를 잠글 수 있기 때문이다.
따라서, 큰 SCC 를 확인했다면 프로그램 설계를 다시 한번 확인해봐야 하며, 소스코드에 불필요한 Object 에 대한 처리가 필요하다.
Memory Snapshot 에는 다양한 Data Object 와 내부 세션의 메모리 소비에 대한 정보가 포함된다.
Memory Snapshot 은 XML 형식으로 AP 서버 OS 단에 저장되며, 최대 4주동안 보관된다.
Memory Snapshot 저장 위치는 프로파일 파라미터
DIR_MEMORY_INSPECTOR
에 의해 결정되며, Default 값은 다음과 같다.
- $(DIR_DATA) =
/usr/sap/<SID>/D<Instance_Number>/data
Memory Snapshot 은 OS 단에 abDbgMemory_XXX_YYYY
이름으로 저장되며, XXX 는 현재 Workproccess 번호 이고, YYYY 는 현재 Workproccess 에서 수행한 Snapshot 시퀸셜 번호이다.
OS 단에 저장되는 모든 Memory Snapshot 의 최대 크기는 프로파일 파라미터 abap/memory_inspector_files_limit_MB
로 설정할 수 있으며, 최대 크기를 초과할 시, 오래된 Memory Snapshot 부터 자동으로 삭제된다.
-> 현재 세션창 상단 메뉴탭 System
-> Utilities
-> Memory Analysis
-> Create Memory Snapshot
-> 하단에 Memory Snapshot Create 메세지 확인
-> 현재 세션창 Tcode Command 창에 명령어 /hmusa
입력
-> 초기 디버깅 화면에서, 소스코드창 오른쪽 패널 중, 3번째 Replace Toole
버튼 클릭
-> Memory Management 폴더 확장
-> Memory Analysis 더블 클릭
-> 첫번째와 똑같이 창 오른쪽 패널 중, 마지막 Services of the Tool
클릭
-> Create Memory Snapshot 더블 클릭
ABAP 프로그램 내부 로직 중, 특정 소스코드에 대해서 Method 를 호출해 Memory Snapshot 을 찍을 수 있다.
-> ABAP 프로그램 소스코드 중, Memory Snapshot 을 찍을 지점으로 이동
-> 해당 지점에 다음 소스코드 삽입
CALL METHOD cl_abap_memory_utilities=>
write_memory_consumption_file
Tcode : SMI / S_MEMORY_INSPECTOR
Memory Inspector 를 사용하여 분석을 하기 위해서는 먼저 Memory Snapshot 이 필요하다. 2-1. Create Memory Snapshot
을 참고하여 Snapshot 을 생성한다.
이 Memory Snapshot 은 다른 ABAP 프로그램 또는 다른 세션의 Snapshot 과 비교하는 것이 불가능하기 때문에, 비교를 위해서는 같은 내부 세션에서 Snapshot 을 찍어야 한다.
이렇게 생성된 Memory Snapshot 은 Memory Inspector 에서 자동으로 보이며, 해당 Snapshot 을 더블클릭하면 자동으로 이전 Snapshot 을 (T_0)
, 이후 Snapshot 을 (T_1)
로 선택된다.
Memory Inspector 에서 표시되는 모든 크기 단위는
Byte
이다.
개요는 ABAP 메모리의 주요 유형에 따른 프로그램의 메모리 소비를 보여준다.
SAP NW 7.4 부터는 ROLL 영역이 EM 과 통합되었으나 Memory Inspector 에서는 여전히 Roll Area 라고 나오는 경우가 있다.
- SAP Notes 2085980 - New features in memory management as of Kernel Release 7.40
Dominator Tree 는 ABAP 프로그램의 Dynamic Memory Object 와 이를 참조하는 변수를 함께 보여준다.
여기서는 두 Snapshot 을 비교할 수는 없으나, 각 Memory Object 의 참조 계층에 대해서는 심도있는 분석이 가능하다.
참조된 Dynamic Memory Object 를 Keep-alive 하게 분석할 경우 사용한다.
ABAP 프로그램의 Memory Object 크기에 따라 순위를 매긴다.
여기서는 두 Snapshot 끼리의 비교가 가능하며, 메모리를 많이 사용한 Object 부터 순서대로 나열된다.
여기서 Snapshot 간 비교를 통해 메모리 사용량의 변화는 색상과 기호로 확인할 수 있다.
+
기호가 붙는다.-
기호가 붙는다.각 유형의 Memory Object 에 적합한 전용 뷰를 보여준다.
Table 뷰에서는 ABAP 프로그램에서 사용 중인 Internal Table 을 확인할 수 있으며, 각 테이블의 총 라인, 바인딩된 스토리지, 할당된 스토리지가 구분되어있다.
ABAP 프로그램의 Memory Object 간의 강한 연결 구성 요소(SCC) 를 보여준다.
프로그램 실행 전과, 실행 후 각각 Memory Snapshot 을 생성하여, 비교를 통해 대상 프로그램의 수행으로 얼만큼의 메모리가 사용되는지를 확인할 수 있다.
또한, 각 Object 별로의 분석을 통해, 어떤 Table, Strings, Instances 에서 메모리를 많이 사용하는지 체크가 가능하며,
이를 통해 다음과 같은 사항을 점검하여 개선포인트를 찾을 수도 있다.