UDN
Search public documentation:

MemLeakCheckTrackingKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 메모리 시스템 > MemLeakCheck 트래킹
UE3 홈 > 퍼포먼스, 프로파일링, 최적화 > 메모리 사용량과 프로파일링 > MemLeakCheck 트래킹

MemLeakCheck 트래킹


문서 변경내역: Ben Zeigler 작성. 홍성진 번역.

개요


MemLeakCheck 는 게임의 어디에 메모리가 사용되고 있는지 에 대해 정말 사용하고 이해하기 쉽게 알려줍니다. 그냥 텍스트 파일이니 diff 해 보면 시간에 따른 변화를 쉽게 알아볼 수 있습니다. 단순히 MemLeakCheck 는 여러가지 중요한 메모리 명령을 전부 호출하는 메타 명령일 뿐입니다. 메모리 정보에 있어서 원-스톱 센터인 것이죠.

MemLeakCheck 실행하기


MemLeakCheck 를 실행하는 방법은 크게 두 가지, 풀 버전과 빠른 버전이 있습니다:

MemLeakCheck

풀 MemLeakCheck 를 만들려면, 콘솔에서 단순히 MemLeakCheck 를 실행시키면 됩니다. 그러면 게임이 (거의 1 분에 달할 만큼) 꽤 오랜 동안 멎어 있다가 Profiling/Memleaks 디렉토리에 맵이름과 타임스탬프에 따라 인덱싱된 커다란 파일이 출력됩니다. 노트패드로 열어주기도 합니다. 풀 MemLeakCheck 에는 거의 모든 중요 애셋 목록이 알파벳순 소트되어 나옵니다. 여러가지 섹션으로 나뉩니다. 풀 MemLeakCheck 는 항상 로드되는 콘텐츠를 추적하는 데도, 시간에 따른 메모리 사용량을 비교하는 데도 매우 좋습니다. 알파벳순 소트 덕에 어느 툴로도 간단히 텍스트를 비교할 수 있을 것입니다.

MemLeakCheck -fast

콘솔에 MemLeakCheck -fast 를 실행시키면 (대략 5 초 정도로) 훨씬 짧은 시간에 그리 자세하지는 않은 리포트를 출력합니다. 이 리포트에는 핵심적인 데이터 추적은 모드 포함되어 있으나, 거대한 애셋 목록과 느린 작업은 제외되어 있습니다. 주로 핫 스팟 리포트 생성 의 일환으로 사용되는 DoMemLeakChecking 에 주로 사용되나, 풀 MemLeakCheck 로 오래 멎는 경우 (네트워크 타임아웃 처럼) 기능이 깨져버릴 때 좋습니다.

Release vs Test

한가지 염두에 둘 것은, 실행파일을 실행하는 데 사용한 환경설정에 따라 MemLeakCheck 명령의 결과과 달라진다는 점입니다. Release 실행시의 정보가 조금 더 정확하겠지만, Release 실행파일의 메모리 사용량은 Test 실행파일보다 훨씬 많을 테니 조절을 좀 해 줘야 합니다. 일반적으로 DoMemLeakChecking 에는 Test 를, 풀 MemLeakCheck 덤프에는 Release 를 사용하는 것이 좋습니다.

사용 예제


메모리 이슈를 추적하는 데 MemLeakCheck 명령을 사용하는 방식은 여러가지가 있습니다:

  • 메모리가 새고 있을 때 빠르게 알아보는 법 중 하나, UObject 메모리가 샌다면 맵 시작시 MemLeakCheck 를 해 보는 것입니다. 잠깐 실행해 봅니다. 그런 다음 다시 MemLeakCheck 해 봅니다. 두 파일을 diff 해서 오브젝트나 관련 풀의 수가 크게 늘어난 곳을 찾아봅니다.
  • 자동화 테스트 도중 5 분마다 MemLeakCheck 를 할 수 있습니다. 그러면 자동화 테스트 과정에 걸쳐 메모리와 오브젝트가 어떻게 변해가는지를 제대로 알아볼 수 있습니다. 이 작업을 빠르고 쉽게 하려면 핫 스팟 리포트 생성 에 설명된 대로 MemLeakCheckDiffer 툴을 사용하면 됩니다.
  • 레벨의 어디에 메모리가 사용되는지 알아내려면 MemLeakCheck 를 해 보십시오. 동적으로 생성되는 오브젝트는 어떤 것들이 있는지, 얼마나 많은 애님세트가 로드되는지 등을 확인할 수 있다는 것은 정말 좋은 일이거든요. 비슷한 상황에서의 두 멀티플레이어 맵을 비교해 보는 것도, 왜 특정 맵이 예상보다 많은 메모리를 사용하는지 알아내기 좋은 방법입니다.
  • 에전 MemLeakCheck 데이터 저장소를 유지하고 주기적으로 새로운 MemLeakCheck 데이터와 diff 해 봄으로써, 프로젝트의 전반적인 수명에 걸쳐 메모리 할당량 변화를 추적할 수 있습니다. "왜 갑자기 지난주보다 메모리가 5MB 나 줄었을까나?" 하는 질문을 파 보는 데 매우 좋습니다.

출력 섹션


MemLeakCheck 출력 파일 크게 몇 섹션으로 나뉩니다. 참고로 MemLeakCheck 파일의 각 섹션은 플랫폼과 게임에 따라 달라집니다:

헤더

파일 상단에는 타임스탬프, 명령줄 (특정 실행시 사용된 -reducepoolsize= 검사시 매우 좋음), BugItGo 위치, 약간의 메모리 개요 정보가 들어 있습니다. 파일에 있는 데이터가 뭔가 이상하다면 꼭, 헤더를 통해 뭔가 이상한 것이 들어왔는지 아니면 예전 파일을 보고 있는 중인지 확인하시기 바랍니다. 또한 대부분의 섹션에는 그 섹션을 만드는 데 사용된 명령이 나열됩니다.

클래스 리스트

Class List(클래스 리스트)는 파일의 첫 주요 덩어리로, 게임의 모든 클래스가 알파벳순 소트된 목록입니다. Count (카운트)는 말 그대로입니다. NumBytes (바이트 수)는 그 클래스의 모든 오브젝트가 현재 사용중인 메모리의 정확한 양입니다. MaxBytes (최대 바이트)는 클래스와 관련된 메모리 할당 총량으로, TArray 슬랙과 같은 메모리도 포함된 것입니다. ResByte (리소스 바이트)는 그 클래스에 관련된 "리소스" 메모리의 총량으로, 어떤 클래스냐에 따라 의미가 달라집니다. TrueResBytes (진짜 리소스 바이트)는 오브젝트 자체적으로 사용된 메모리에 추가로 필요한 "리소스" 메모리 양입니다. 예를 들어 ParticleSystemComponent 의 TrueResByte 는 현재 활성 PSC 에 필요한 렌더-스레드 메모리 양입니다. 일반적으로 한 클래스가 정말로 얼마만큼의 메모리를 사용하는가를 확인하려면 MaxBytes 와 TrueResBytes 를 더하는 것이 좋습니다.

전용 오브젝트 목록

여기서는 풀 MemLeakCheck 안에는 여러가지 자세한 오브젝트 목록이 나옵니다. 깊이 내려가 보면 다른 것도 있습니다. 개별 애셋들이 나열된다는 점만 빼곤 클래스 리스트와 비슷합니다.

플랫폼 메모리

다음 섹션은 플랫폼-전용 메모리로, 크게 다양해지는 부분입니다. 대부분의 경우 Release 모드가 좀 더 쓸만한 플랫폼 메모리를 내며, 모든 STAT MEMORY 변수 값을 출력하기도 합니다.

게임 전용 메모리

이 섹션은 게임-전용 메모리 할당에 대한 것입니다.

렌더링 메모리

여기서는 렌더 타겟, GPU 리소스, 셰이더 캐시, 텍스처 스트리밍, 옥트리 크기가 출력됩니다. Test 에서는 그 데이터를 쓸 수 없기에 빠져 있거나 부정확한 정보입니다.

컨픽/패키지 메모리

로드된 모든 컨픽/로컬리제이션 파일 크기와, 풀 패키지 목록이 출력됩니다. 패키지 목록은 주어진 시점에 어떤 종류의 데이터가 로드되는지를 알아보는 데 있어 특히나 좋으며, 풀 / -fast 출력 둘 다에 있습니다.

애셋 리스트

풀 덤프 안에는 이제 텍스처, 사운드, 파티클 전체 목록이 출력됩니다. 깊게 내려가 보면 다른 것도 있지만, 대부분은 -fast 모드에서 생략되는 것입니다.

액터 리스트

풀 액터 리스트와 함께 생성 시간과 오너가 그 옆에 출력됩니다. 긴 플레이 세션에 걸친 액터 누수를 찾는 데 매우 좋습니다.

레벨 리스트

STAT LEVELS 명령 결과가 출력됩니다. 메모리 사용량과 현재 로드된 레벨을 서로 연관시키는 데 좋으며, 메모리 급변(spike)을 추적하는 데 도움이 됩니다.