비트맵은 앱에서 메모리를 가장 많이 사용하는 객체인 경우가 많습니다. 디코딩 및 크기 조절 작업은 프레임 렌더링의 중요한 경로에 있는 경우가 많습니다. 비트맵 메모리 사용량을 최적화하면 버벅거림, ANR, OOM 관련 프로세스 종료를 줄여 UI 응답성, 배터리 수명, 전반적인 안정성이 크게 개선됩니다.
비트맵 메모리 사용량이 많은 원인
사용된 적이 없는 가상 메모리도 계산에 포함될 수 있습니다. 예상치 못한 높은 비트맵 메모리 사용량이 표시되면 사용되지 않는 메모리를 할당하지 않는지 확인하세요.
리소스
Android 스튜디오에서 비트맵 분석
비트맵용 Android 스튜디오 프로파일링
메모리 프로파일러를 사용하여 메모리 할당을 실시간으로 검사하고, 힙 덤프를 캡처하고, 객체를 분석하여 메모리 누수를 확인합니다. 또한 힙 분석기를 사용하여 메모리 누수를 감지하고, 중복 비트맵 할당을 식별하고, 객체 유지를 시각화합니다.
LeakCanary를 사용한 자동 누수 감지
LeakCanary 라이브러리를 통합하여 앱에서 메모리 누수를 자동으로 감지합니다. LeakCanary는 자동 힙 분석을 제공하여 가비지 수집되었어야 하지만 메모리에 계속 보관되는 객체를 식별합니다(예: 삭제된 구성요소에 의해 유지되는 비트맵).
비트맵 성능 문서
이러한 리소스는 다양한 Android 구성요소에서 효율적인 비트맵 처리를 위한 권장사항에 관한 포괄적인 가이드를 제공합니다.
비트맵 메모리 사용량 최적화를 위한 개발자 체크리스트
비트맵 메모리 효율성을 최적화하려면 줄이기, 재사용, 재활용이라는 세 가지 핵심 원칙을 따르세요.
- 줄이기: 비트맵을 로드하거나 표시할 때 초기 메모리 사용량을 최소화합니다.
- 재사용: 중복 비트맵 할당을 방지하기 위해 캐싱 메커니즘을 구현합니다.
- 재활용: 활성 프로세스의 메모리 재할당을 허용하기 위해 리소스를 사전 예방적으로 해제합니다.
다음 개발자 체크리스트는 비트맵 메모리 사용량을 최적화하는 데 도움이 됩니다.
| 핵심 원칙 | 영역 | 설명 |
|---|---|---|
| 줄이기 | 중복 비트맵 삭제 | 메모리 프로파일러를 사용하여 힙 덤프를 분석하여 중복 비트맵 할당을 감지합니다. 비트맵 메모리 관리 가이드를 참고하세요. |
| 이미지 로드 라이브러리 활용 | Glide 및 Coil과 같은 라이브러리를 사용하여 스레딩, 캐싱, 효율적인 디코딩을 자동화합니다. | |
| 다운샘플링 구현 | 전체 해상도 애셋을 로드하는 대신 타겟 UI 컨테이너 크기에 맞게 이미지를 디코딩합니다. | |
| 불투명 이미지에 RGB_565 사용 | 투명도가 없는 이미지의 경우 ARGB_8888에서 16비트 구성으로 전환하여 메모리 사용 공간을 50% 줄입니다. |
|
| VectorDrawable 우선순위 지정 | 아이콘과 기본 그래픽에 벡터를 사용하여 메모리 오버헤드를 최소화하면서 선명하게 확장하세요. | |
| 서버 측 이미지 전송 최적화 | 기기 밀도 및 UI 컨테이너 크기에 맞게 조정된 이미지를 제공하도록 백엔드 API를 구성합니다. | |
| 투명 여백 제거 | 내장된 여백 대신 InsetDrawable 또는 레이아웃 패딩을 사용하여 '보이지 않는' 픽셀의 메모리를 할당하지 마세요. 메모리 성능이 우수한 Android 앱 엔지니어링을 참고하세요. | |
| 재사용 | 최적의 캐시 크기 구성 | 기기 RAM 및 화면 해상도에 따라 메모리 및 디스크 캐시 한도를 조정합니다. 비트맵 캐싱을 참고하세요. |
| 재활용 | 백그라운드에서 리소스 삭제 | TRIM_MEMORY_BACKGROUND 구현: 시스템 메모리 압력 중에 캐시를 지우고 프로세스 생존을 개선합니다. |
| UI가 숨겨지면 발표 관련 콘텐츠가 해제됨 | 앱이 사용자에게 더 이상 표시되지 않으면 TRIM_MEMORY_UI_HIDDEN 사용을 사용하여 비트맵 캐시를 해제합니다. |
|
| 메모리 누수 모니터링 | LeakCanary 및 메모리 프로파일러를 사용하여 LifecycleOwner가 소멸된 후에도 유지되는 비트맵을 찾습니다. 앱 메모리 관리를 참고하세요. |