Android에서는 여러 유형의 성능 프로필을 기록할 수 있습니다. 프로필을 수집하면 앱의 실행 속도, 사용되는 메모리 양, 소비되는 전력 등과 관련된 문제를 디버그하는 데 도움이 됩니다.
이 문서에서는 가장 유용한 프로필 유형과 일반적인 성능 문제를 디버깅하기 위해 각 프로필을 언제 사용해야 하는지 설명합니다.
시스템 트레이스

시스템 트레이스는 프로세스, 스레드, 타이밍 정보, CPU 및 작업 실행, 시스템 또는 사용자 정의 이벤트에 관한 정보를 포함하는 강력한 프로필입니다.
앱 관점에서 트레이스의 정보는 지연 시간, 끊김 현상, 메모리, 배터리 등 다양한 영역에 걸쳐 있을 수 있습니다.
시스템 트레이스에는 시스템 또는 사용자가 정의할 수 있는 다음 코드 기반 이벤트가 포함됩니다. 코드 기반 이벤트는 사용자가 함수 호출을 통해 트리거할 수 있는 이벤트입니다.
- 트레이스 슬라이스: 코드의 여러 지점 간 시간을 나타냅니다.
Trace.beginSection
및Trace.endSection
API를 사용하여 추가할 수 있습니다. - 추적 카운터: 측정항목을 나타내는 숫자 값입니다(예: 힙 크기).
Trace.setCounter
API를 사용하여 추가할 수 있습니다.
시스템 트레이스에는 PerfettoSQL 쿼리에서 생성할 수 있고 분석을 실행하거나 트레이스를 비교하는 데 사용할 수 있는 측정항목도 포함되어 있습니다.
시스템 트레이스를 사용하여 다음 작업을 실행하는 것이 좋습니다.
지연 시간 문제 진단 시스템 트레이스는 지연, 대기 또는 예약 문제로 인해 발생하는 지연 시간 문제를 찾는 데 유용합니다. 샘플 기반 프로필과 같은 다른 프로파일러는 시스템 트레이스에서 제공하는 타이밍 정보를 제공하지 않습니다.
중복된 계산을 찾습니다. 추적을 통해 특정 계산이 반복되는지 확인할 수 있으며, 이는 불필요한 작업을 나타낼 수 있습니다.
잠금 경합 문제 진단 스레드 상태와 리소스가 차단된 시점을 보여주는 슬라이스에 관한 정보를 사용하면 잠금(예:
synchronized
블록)으로 인해 사용자 여정이 지연되는지 확인할 수 있습니다.앱의 멀티 스레딩 이해: 트레이스는 여러 스레드를 보여주며 각 스레드의 상태와 시스템 또는 앱에서 추가한 트레이스 슬라이스를 표시합니다. 이 멀티 스레드 뷰를 사용하면 활성 상태인 스레드, 절전 모드인 스레드, 실행 중인 스레드, 스레드 간 상호작용 방식을 파악할 수 있습니다.
복잡한 실적 분석을 수행합니다. 강력한 사용자 인터페이스와 다양한 유형의 정보를 표시하는 기능을 통해 시스템 트레이스는 지연 시간, 메모리, 배터리 사용량 등 다양한 성능 문제를 디버깅하는 데 유용합니다.
시스템 트레이스는 PerfettoSQL을 사용한 쿼리도 지원합니다. 이 강력한 기능을 사용하면 다음 작업을 할 수 있습니다.
- 특정 데이터 추출
- 트레이스 데이터를 맞춤 측정항목으로 변환합니다.
- 쿼리에서 디버그 트랙을 만들어 Perfetto UI에서 가장 관심 있는 항목을 더 쉽게 시각화할 수 있습니다.
- Perfetto UI 내에서 직접 복잡한 분석을 수행합니다.
스택 샘플 프로필

스택 샘플 프로필은 코드 실행 샘플을 기록하고 스레드가 CPU에서 작업을 실행하는 동안 설정된 비율로 호출 스택 정보를 저장하여 작동합니다. 이를 통해 실행 중에 코드가 수행하는 작업을 파악할 수 있습니다.
스택 샘플을 사용하여 다음 작업을 하는 것이 좋습니다.
- 핫스팟 최적화 스택 샘플은 CPU 활동이 많은 코드 부분을 식별하는 데 도움이 됩니다. 즉, 스레드가 '실행' 상태에 있는 경우가 많습니다.
- 코드 실행 이해하기 스택 샘플을 사용하면 코드베이스의 전반적인 동작을 파악할 수 있습니다.
- 실행하면 안 되는 코드 식별 전혀 실행되지 않아야 하는 호출 스택을 발견할 수 있으며, 이는 즉각적인 최적화 기회를 나타냅니다.
힙 덤프

Java 힙 덤프는 앱의 Java 힙 메모리의 스냅샷을 보여줍니다. 이 스냅샷에는 덤프가 생성된 시점의 모든 객체와 객체 간 참조가 포함됩니다.
다음 작업을 수행하려면 힙 덤프를 수집하는 것이 좋습니다.
- 중복된 객체를 찾아냅니다. 힙 덤프는 라이브 객체 수를 보여주므로 중복된 객체를 추적하는 데 유용합니다. 또한 객체 참조를 제공하여 객체가 생성된 코드 위치를 정확히 파악할 수 있습니다.
- 메모리 누수 찾기 힙 덤프는 덤프가 생성될 때 더 이상 사용되지 않아야 하는 메모리를 표시하여 잠재적인 메모리 누수를 나타낼 수 있습니다.
- 최적화할 수 있는 객체를 식별합니다. 힙 덤프는 많은 메모리를 사용하는 객체와 그 수를 보여주므로 비효율적인 메모리 사용 패턴을 식별하는 데 도움이 됩니다.
힙 프로필

힙 프로필은 네이티브 버전과 Java 버전이 모두 있으며 메모리 문제를 디버깅하는 데 유용합니다. 메모리 할당 시 샘플을 가져온다는 점을 제외하면 호출 스택 샘플과 유사합니다.
힙 프로필을 사용하여 다음 작업을 실행하는 것이 좋습니다.
- 메모리 급변 감소 힙 프로필은 메모리 할당의 코드 위치가 포함된 샘플을 제공합니다. 이를 통해 임시 객체를 많이 생성하는 영역을 식별할 수 있으며, 이는 앱에서 빈번한 가비지 컬렉션(GC)의 원인이 될 수 있습니다.
- 메모리 누수 발견 힙 프로필은 다른 메모리 프로필과 함께 사용하여 메모리 누수를 진단하고 수정할 수 있습니다. 이를 통해 예상보다 훨씬 더 많은 메모리를 할당하는 위치를 정확히 파악할 수 있습니다.
프로필 결합
일반적으로 단일 프로필을 사용하여 성능을 분석합니다. 하지만 여러 프로필 또는 단일 결합 프로필을 수집하면 더 완전한 그림을 제공하고 단일 프로필만으로는 진단할 수 없는 복잡한 문제를 진단하는 데 도움이 되는 경우가 많습니다.
프로필을 결합하는 것이 유용한 시나리오를 고려해 보세요.
시나리오 1: 계측되지 않은 코드 조사 시스템 트레이스에는 이미 계측한 작업의 지연 시간이 표시될 수 있습니다. 하지만 이러한 시간 동안 실행되는 계측되지 않은 코드 부분에 관한 정보가 더 필요할 수 있습니다. 조사하려면 호출 스택 프로필을 가져와 실행된 코드를 파악하세요. 이 정보를 사용하면 더 많은 추적 슬라이스를 추가하여 추적을 개선할 수 있습니다.
시나리오 2: 메모리 누수 및 가비지 컬렉션 분석 할당으로 인해 Java 힙 메모리가 지속적으로 증가하여 가비지 컬렉션 (GC)이 자주 트리거되는 시스템 트레이스를 상상해 보세요. 할당된 객체를 이해하려면 힙 프로필이나 힙 덤프를 가져옵니다. 이러한 조합된 접근 방식을 사용하면 메모리 사용량을 줄이는 방법을 파악할 수 있습니다. 예를 들어 캐시를 사용하여 낭비되거나 최적화 가능한 할당을 줄이면 GC가 발생하지 않을 수 있습니다.