Perfetto UI에서 프로필 시각화

테스트 기기에서 프로필을 가져오거나 백엔드에서 다운로드한 후 Perfetto UI에서 파일을 열어 타임라인, 스레드 상태, 메모리 보관 그래프를 검사할 수 있습니다. 이 페이지에서는 ProfilingManager로 캡처된 수정된 시스템 트레이스 및 Java 힙 덤프를 탐색하는 방법을 설명합니다.

시스템 트레이스 시각화

Perfetto UI에서 .perfetto-trace 파일을 열어 시간 경과에 따른 CPU 및 스레드 활동을 검사합니다.

Perfetto UI에서 수정된 시스템 트레이스의 타임라인
그림 1. 수정된 trace 예시

사용자 개인 정보 보호를 위해 ProfilingManager는 다른 모든 프로세스의 CPU 활동을 단일 OtherProcesses 트랙으로 결합하여 시스템 트레이스를 수정합니다. 이 결합된 트랙을 검사하면 앱의 속도 저하가 내부 병목 현상으로 인한 것인지 아니면 전체 기기 부하로 인한 것인지 확인할 수 있습니다.

그림 2는 수정된 시스템 트레이스의 주요 섹션을 보여줍니다.

Perfetto UI에서 수정된 시스템 트레이스의 번호가 매겨진 섹션
그림 2. 수정된 트레이스의 섹션
  1. CPU 목록: 기기에서 사용 가능한 모든 프로세서를 표시합니다.
  2. CPU tasks: 각 CPU가 실행 중인 스레드를 표시합니다.
  3. 기타 프로세스 뷰: 다른 프로세스에서 소비하는 CPU 리소스를 표시합니다.
  4. Process View: 앱의 프로세스를 표시합니다.
  5. 스레드 뷰: 프로세스 내에서 실행 중인 스레드와 스레드 상태(실행 가능(R), 실행 중(R), 일시정지(S), 중단 불가능한 일시정지(D))를 표시하며, 이는 Linux 프로세스 상태에 직접 매핑됩니다.
  6. 트레이스 슬라이스: 이 섹션에는 앱 개발자 또는 프레임워크에서 추가한 트레이스 주석이 표시됩니다. 이러한 주석은 Trace.beginSection와 Trace.endSection 간의 계산을 포함합니다.

Perfetto UI 및 트레이스 시각화에 관한 자세한 내용은 Perfetto 문서를 참고하세요.

Java 힙 덤프 시각화

PROFILING_TYPE_JAVA_HEAP_DUMP를 사용하여 Java 힙 덤프를 캡처한 후 Perfetto UI에서 결과 .perfetto-java-heap-dump 파일을 열어 메모리 누수를 식별하거나 메모리 사용량을 최적화합니다. Heapdump Explorer에서 힙 그래프를 탐색하고, 누적 객체 크기의 Flame 그래프를 검사하고, 클래스, 객체, 도미네이터를 탐색할 수 있습니다(그림 3 참고).

Java 힙 객체 크기의 Flame 그래프를 보여주는 Perfetto UI Heapdump Explorer
그림 3. Perfetto UI의 Java 힙 덤프 Flame 그래프

ProfilingManager 힙 덤프와 HPROF 덤프의 차이점

표준 .hprof 힙 덤프(예: Debug.dumpHprofData 또는 Android 스튜디오에서 캡처한 힙 덤프)와 달리 ProfilingManager는 Perfetto ART 힙 덤프(.perfetto-java-heap-dump)를 캡처합니다. ProfilingManager는 원시 메모리 콘텐츠를 덤프하는 대신 객체 보관 그래프 및 크기 조정 메타데이터를 기록하고 객체 내부에 저장된 원시 데이터는 생략합니다.

  • 수집되는 정보:
    • 클래스 및 유형: 클래스 이름, 슈퍼클래스 계층 구조, 클래스 로더, 인스턴스 크기, 참조 유형(예: 일반 클래스, 배열, 문자열 또는 약한 참조, 소프트 참조, 파이널라이저 참조, 팬텀 참조)
    • 객체 인스턴스 및 크기: 각 객체의 Shallow Size(self_size), 힙 영역(HEAP_TYPE_APP, HEAP_TYPE_ZYGOTE 또는 HEAP_TYPE_BOOT_IMAGE), NativeAllocationRegistry를 통해 등록된 연결된 네이티브 메모리입니다.
    • 참조 및 GC 루트: 가비지 컬렉션 루트(예: JNI 전역 및 로컬, Java 스택 프레임, 스레드 객체) 및 어떤 객체가 어떤 필드 이름을 통해 다른 객체를 유지하는지 보여주는 필드 수준 참조 체인입니다.
    • 크기 조정 메타데이터 선택: 특정 프레임워크 유형에 대한 민감하지 않은 메타데이터(예: Bitmap 측정기준(mWidth 및 mHeight))입니다.
  • 생략된 항목: 실제 기본 필드 값, String 문자 콘텐츠, 원시 배열 페이로드(byte[], char[], 기타 기본 배열) 원시 객체 콘텐츠를 생략하면 프로덕션 기기에서 사용자 개인 정보 보호가 가능하고 덤프 파일이 훨씬 작아집니다.

다음 단계

Perfetto UI에서 시각적으로 검사하는 것 외에도 PerfettoSQL로 프로필을 쿼리하거나, 트레이스를 일괄 분석하거나, AI로 프로필을 분석할 수 있습니다.