프로필 유형 및 각 유형이 유용한 경우

Android에서는 여러 유형의 성능 프로필을 기록할 수 있습니다. 프로필을 수집하면 앱 실행 속도, 사용되는 메모리 양, 소비되는 전력량 등과 관련된 문제를 디버깅하는 데 도움이 됩니다.

이 문서에서는 가장 유용한 프로필 유형과 일반적인 성능 문제를 디버깅하기 위해 각 프로필을 사용하는 시기를 설명합니다.

시스템 트레이스

시스템 트레이스 예시
그림 1.: 시스템 트레이스 예시

시스템 트레이스는 프로세스, 스레드, 타이밍 정보, CPU 및 작업 실행, 시스템 또는 사용자 정의 이벤트에 관한 정보가 포함된 강력한 프로필입니다.

앱 관점에서 트레이스의 정보는 지연 시간, 버벅거림, 메모리, 배터리 등 광범위한 영역에 걸쳐 있을 수 있습니다.

시스템 트레이스에는 시스템 또는 사용자 정의가 가능한 다음과 같은 코드 기반 이벤트가 포함되어 있습니다. 코드 기반 이벤트는 사용자가 함수 호출을 통해 트리거할 수 있는 이벤트입니다.

  • 트레이스 슬라이스: 코드의 여러 지점 간의 시간을 나타냅니다. Trace.beginSectionTrace.endSection API를 사용하여 추가할 수 있습니다.
  • 트레이스 카운터: 측정항목(예: 힙 크기)을 나타내는 숫자 값입니다. Trace.setCounter API를 사용하여 추가할 수 있습니다.

시스템 트레이스에는 PerfettoSQL 쿼리에서 생성할 수 있고 트레이스를 분석하거나 비교하는 데 사용할 수 있는 측정항목도 포함되어 있습니다.

시스템 트레이스를 사용하여 다음 작업을 실행하는 것이 좋습니다.

  • 지연 시간 문제 진단. 시스템 트레이스는 지연, 대기 또는 예약 문제로 인해 발생하는 지연 시간 문제를 찾는 데 유용합니다. 샘플 기반 프로필과 같은 다른 프로파일러는 시스템 트레이스에서 제공하는 타이밍 정보를 제공하지 않습니다.

  • 중복된 계산 찾기. 트레이스를 사용하면 특정 계산이 반복되는지 확인할 수 있으며, 이는 불필요한 작업을 나타낼 수 있습니다.

  • 잠금 경합 문제 진단. 스레드 상태 및 리소스가 차단된 시점을 보여주는 슬라이스에 관한 정보를 사용하여 잠금(synchronized 블록과 같은)이 사용자 여정에서 지연을 일으키는지 확인할 수 있습니다.

  • 앱의 멀티 스레딩 이해. 트레이스는 여러 스레드의 뷰를 제공하여 각 스레드의 상태와 시스템 또는 앱에서 추가한 트레이스 슬라이스를 보여줍니다. 이 멀티 스레드 뷰를 사용하면 활성 상태인 스레드, 절전 모드인 스레드 또는 실행 중인 스레드와 상호작용 방식을 이해할 수 있습니다.

  • 복잡한 성능 분석 실행. 강력한 사용자 인터페이스와 다양한 유형의 정보를 표시하는 기능을 통해 시스템 트레이스는 지연 시간, 메모리, 배터리 사용량을 비롯한 광범위한 성능 문제를 디버깅하는 데 유용합니다.

시스템 트레이스는 PerfettoSQL을 사용한 쿼리도 지원합니다. 이 강력한 기능을 사용하면 다음 작업을 실행할 수 있습니다.

  • 특정 데이터 추출.
  • 트레이스 데이터를 맞춤 측정항목으로 변환.
  • 쿼리에서 디버그 트랙을 만들어 Perfetto UI에서 가장 중요한 항목을 더 쉽게 시각화합니다.
  • Perfetto UI 내에서 직접 복잡한 분석을 실행합니다.

스택 샘플 프로필

스택 샘플
프로필 예시
그림 2.: 스택 샘플 프로필 예시

스택 샘플 프로필은 스레드가 CPU에서 작업을 실행하는 동안 설정된 속도로 코드 실행 샘플을 기록하고 호출 스택 정보를 저장하는 방식으로 작동합니다. 이를 통해 실행 중에 코드가 수행하는 작업을 파악할 수 있습니다.

스택 샘플을 사용하여 다음 작업을 실행하는 것이 좋습니다.

  • 핫스팟 최적화. 스택 샘플은 CPU 활동이 많은 코드 부분을 식별하는 데 도움이 됩니다. 즉, 스레드가 '실행 중' 상태인 경우가 많습니다.
  • 코드 실행 이해. 스택 샘플은 코드베이스의 전반적인 동작을 이해하는 데 도움이 될 수 있습니다.
  • 실행하면 안 되는 코드 식별. 전혀 실행되지 않아야 하는 호출 스택을 찾을 수 있으며, 이는 즉각적인 최적화 기회를 나타냅니다.

힙 덤프

힙 덤프 예시
그림 3.: 힙 덤프 예시

자바 힙 덤프는 앱의 자바 힙 메모리 스냅샷을 보여줍니다. 이 스냅샷에는 덤프가 생성될 때 모든 객체와 객체가 서로 참조하는 방식이 포함됩니다.

힙 덤프를 수집하여 다음 작업을 실행하는 것이 좋습니다.

  • 중복된 객체 찾기. 힙 덤프는 라이브 객체의 수를 보여주므로 중복된 객체를 추적하는 데 유용합니다. 또한 객체 참조를 제공하여 객체가 생성된 코드 위치를 정확히 파악하는 데 도움이 됩니다.
  • 메모리 누수 찾기. 힙 덤프는 덤프가 생성될 때 더 이상 사용되지 않아야 하는 메모리를 보여주므로 잠재적인 메모리 누수를 나타낼 수 있습니다.
  • 최적화할 수 있는 객체 식별. 힙 덤프는 많은 메모리를 사용하는 객체와 객체 수를 보여주므로 비효율적인 메모리 사용 패턴을 식별하는 데 도움이 됩니다.

힙 프로필

힙 프로필 예
그림 4.: 힙 프로필 예시

힙 프로필은 네이티브 버전과 자바 버전으로 제공되며 메모리 문제를 디버깅하는 데 유용합니다. 호출 스택 샘플과 비슷하지만 CPU 주기를 측정하는 대신 메모리가 할당될 때 샘플을 가져옵니다.

힙 프로필을 사용하여 다음 작업을 실행하는 것이 좋습니다.

  • 메모리 급변 줄이기. 힙 프로필은 메모리 할당을 위한 코드 위치가 있는 샘플을 제공합니다. 이를 통해 많은 임시 객체를 만드는 영역을 식별할 수 있으며, 이는 앱에서 가비지 컬렉션(GC)이 자주 발생하는 데 기여할 수 있습니다.
  • 메모리 누수 찾기. 힙 프로필은 다른 메모리 프로필과 함께 사용하여 메모리 누수를 진단하고 수정할 수 있습니다. 이를 통해 예상보다 훨씬 많은 메모리를 할당하는 위치를 정확히 파악할 수 있습니다.

프로필 결합

성능은 단일 프로필을 사용하여 분석하는 경우가 많습니다. 그러나 여러 프로필 또는 단일 결합 프로필을 수집하면 더 완전한 그림을 제공하고 단일 프로필만으로는 진단할 수 없는 복잡한 문제를 진단하는 데 도움이 될 수 있습니다.

프로필을 결합하는 것이 유용한 시나리오를 고려해 보세요.

  • 시나리오 1: 계측되지 않은 코드 조사. 시스템 트레이스는 이미 계측한 작업의 지연 시간을 보여줄 수 있습니다. 그러나 이러한 시간 동안 실행되는 코드의 계측되지 않은 부분에 관한 추가 정보가 필요할 수 있습니다. 조사하려면 호출 스택 프로필을 가져와 실행된 코드를 파악하세요. 이 정보를 통해 트레이스 슬라이스를 더 추가하여 트레이스를 개선할 수 있습니다.

  • 시나리오 2: 메모리 누수 및 가비지 컬렉션 분석. 할당으로 인해 Java 힙 메모리가 지속적으로 증가하여 가비지 컬렉션 (GC)이 자주 트리거되는 시스템 트레이스를 상상해 보세요. 할당된 객체를 파악하려면 힙 프로필 또는 힙 덤프를 가져오세요. 이 결합된 접근 방식을 사용하면 메모리 사용량을 줄이는 방법을 식별할 수 있습니다. 예를 들어 캐싱을 사용하여 낭비되거나 최적화 가능한 할당을 줄이면 GC가 발생하지 않도록 할 수 있습니다.