Android에서는 여러 유형의 성능 프로필을 기록할 수 있습니다. 프로필을 수집하면 앱 실행 속도, 사용되는 메모리 양, 소비되는 전력량 등과 관련된 문제를 디버깅하는 데 도움이 됩니다.
이 문서에서는 가장 유용한 프로필 유형과 일반적인 성능 문제를 디버깅하기 위해 각 프로필을 사용하는 시기를 설명합니다.
시스템 트레이스
시스템 트레이스는 프로세스, 스레드, 타이밍 정보, CPU 및 작업 실행, 시스템 또는 사용자 정의 이벤트에 관한 정보가 포함된 강력한 프로필입니다.
앱 관점에서 트레이스의 정보는 지연 시간, 버벅거림, 메모리, 배터리 등 광범위한 영역에 걸쳐 있을 수 있습니다.
시스템 트레이스에는 시스템 또는 사용자 정의가 가능한 다음과 같은 코드 기반 이벤트가 포함되어 있습니다. 코드 기반 이벤트는 사용자가 함수 호출을 통해 트리거할 수 있는 이벤트입니다.
- 트레이스 슬라이스: 코드의 여러 지점 간의 시간을 나타냅니다.
Trace.beginSection및Trace.endSectionAPI를 사용하여 추가할 수 있습니다. - 트레이스 카운터: 측정항목(예: 힙 크기)을 나타내는 숫자 값입니다.
Trace.setCounterAPI를 사용하여 추가할 수 있습니다.
시스템 트레이스에는 PerfettoSQL 쿼리에서 생성할 수 있고 트레이스를 분석하거나 비교하는 데 사용할 수 있는 측정항목도 포함되어 있습니다.
시스템 트레이스를 사용하여 다음 작업을 실행하는 것이 좋습니다.
지연 시간 문제 진단. 시스템 트레이스는 지연, 대기 또는 예약 문제로 인해 발생하는 지연 시간 문제를 찾는 데 유용합니다. 샘플 기반 프로필과 같은 다른 프로파일러는 시스템 트레이스에서 제공하는 타이밍 정보를 제공하지 않습니다.
중복된 계산 찾기. 트레이스를 사용하면 특정 계산이 반복되는지 확인할 수 있으며, 이는 불필요한 작업을 나타낼 수 있습니다.
잠금 경합 문제 진단. 스레드 상태 및 리소스가 차단된 시점을 보여주는 슬라이스에 관한 정보를 사용하여 잠금(
synchronized블록과 같은)이 사용자 여정에서 지연을 일으키는지 확인할 수 있습니다.앱의 멀티 스레딩 이해. 트레이스는 여러 스레드의 뷰를 제공하여 각 스레드의 상태와 시스템 또는 앱에서 추가한 트레이스 슬라이스를 보여줍니다. 이 멀티 스레드 뷰를 사용하면 활성 상태인 스레드, 절전 모드인 스레드 또는 실행 중인 스레드와 상호작용 방식을 이해할 수 있습니다.
복잡한 성능 분석 실행. 강력한 사용자 인터페이스와 다양한 유형의 정보를 표시하는 기능을 통해 시스템 트레이스는 지연 시간, 메모리, 배터리 사용량을 비롯한 광범위한 성능 문제를 디버깅하는 데 유용합니다.
시스템 트레이스는 PerfettoSQL을 사용한 쿼리도 지원합니다. 이 강력한 기능을 사용하면 다음 작업을 실행할 수 있습니다.
- 특정 데이터 추출.
- 트레이스 데이터를 맞춤 측정항목으로 변환.
- 쿼리에서 디버그 트랙을 만들어 Perfetto UI에서 가장 중요한 항목을 더 쉽게 시각화합니다.
- Perfetto UI 내에서 직접 복잡한 분석을 실행합니다.
스택 샘플 프로필
스택 샘플 프로필은 스레드가 CPU에서 작업을 실행하는 동안 설정된 속도로 코드 실행 샘플을 기록하고 호출 스택 정보를 저장하는 방식으로 작동합니다. 이를 통해 실행 중에 코드가 수행하는 작업을 파악할 수 있습니다.
스택 샘플을 사용하여 다음 작업을 실행하는 것이 좋습니다.
- 핫스팟 최적화. 스택 샘플은 CPU 활동이 많은 코드 부분을 식별하는 데 도움이 됩니다. 즉, 스레드가 '실행 중' 상태인 경우가 많습니다.
- 코드 실행 이해. 스택 샘플은 코드베이스의 전반적인 동작을 이해하는 데 도움이 될 수 있습니다.
- 실행하면 안 되는 코드 식별. 전혀 실행되지 않아야 하는 호출 스택을 찾을 수 있으며, 이는 즉각적인 최적화 기회를 나타냅니다.
힙 덤프
자바 힙 덤프는 앱의 자바 힙 메모리 스냅샷을 보여줍니다. 이 스냅샷에는 덤프가 생성될 때 모든 객체와 객체가 서로 참조하는 방식이 포함됩니다.
힙 덤프를 수집하여 다음 작업을 실행하는 것이 좋습니다.
- 중복된 객체 찾기. 힙 덤프는 라이브 객체의 수를 보여주므로 중복된 객체를 추적하는 데 유용합니다. 또한 객체 참조를 제공하여 객체가 생성된 코드 위치를 정확히 파악하는 데 도움이 됩니다.
- 메모리 누수 찾기. 힙 덤프는 덤프가 생성될 때 더 이상 사용되지 않아야 하는 메모리를 보여주므로 잠재적인 메모리 누수를 나타낼 수 있습니다.
- 최적화할 수 있는 객체 식별. 힙 덤프는 많은 메모리를 사용하는 객체와 객체 수를 보여주므로 비효율적인 메모리 사용 패턴을 식별하는 데 도움이 됩니다.
힙 프로필
힙 프로필은 네이티브 버전과 자바 버전으로 제공되며 메모리 문제를 디버깅하는 데 유용합니다. 호출 스택 샘플과 비슷하지만 CPU 주기를 측정하는 대신 메모리가 할당될 때 샘플을 가져옵니다.
힙 프로필을 사용하여 다음 작업을 실행하는 것이 좋습니다.
- 메모리 급변 줄이기. 힙 프로필은 메모리 할당을 위한 코드 위치가 있는 샘플을 제공합니다. 이를 통해 많은 임시 객체를 만드는 영역을 식별할 수 있으며, 이는 앱에서 가비지 컬렉션(GC)이 자주 발생하는 데 기여할 수 있습니다.
- 메모리 누수 찾기. 힙 프로필은 다른 메모리 프로필과 함께 사용하여 메모리 누수를 진단하고 수정할 수 있습니다. 이를 통해 예상보다 훨씬 많은 메모리를 할당하는 위치를 정확히 파악할 수 있습니다.
프로필 결합
성능은 단일 프로필을 사용하여 분석하는 경우가 많습니다. 그러나 여러 프로필 또는 단일 결합 프로필을 수집하면 더 완전한 그림을 제공하고 단일 프로필만으로는 진단할 수 없는 복잡한 문제를 진단하는 데 도움이 될 수 있습니다.
프로필을 결합하는 것이 유용한 시나리오를 고려해 보세요.
시나리오 1: 계측되지 않은 코드 조사. 시스템 트레이스는 이미 계측한 작업의 지연 시간을 보여줄 수 있습니다. 그러나 이러한 시간 동안 실행되는 코드의 계측되지 않은 부분에 관한 추가 정보가 필요할 수 있습니다. 조사하려면 호출 스택 프로필을 가져와 실행된 코드를 파악하세요. 이 정보를 통해 트레이스 슬라이스를 더 추가하여 트레이스를 개선할 수 있습니다.
시나리오 2: 메모리 누수 및 가비지 컬렉션 분석. 할당으로 인해 Java 힙 메모리가 지속적으로 증가하여 가비지 컬렉션 (GC)이 자주 트리거되는 시스템 트레이스를 상상해 보세요. 할당된 객체를 파악하려면 힙 프로필 또는 힙 덤프를 가져오세요. 이 결합된 접근 방식을 사용하면 메모리 사용량을 줄이는 방법을 식별할 수 있습니다. 예를 들어 캐싱을 사용하여 낭비되거나 최적화 가능한 할당을 줄이면 GC가 발생하지 않도록 할 수 있습니다.