피드로 돌아가기
Dev.toFrontend
원문 읽기
Two-Tier LRU Cache와 Platform Texture 브릿징을 통한 iOS OOM 완전 해결
Taming Compose Multiplatform Image Decoding on iOS
AI 요약
Context
Compose Multiplatform의 Skia 백엔드가 iOS 고유의 UIImage/ImageIO 메모리 관리 메커니즘을 우회하여 발생하는 메모리 누수 문제. Kotlin/Native GC가 대규모 ByteArray의 실제 바이트 볼륨을 인식하지 못해 발생하는 OOM(Out of Memory) 크래시가 주요 병목 지점으로 분석됨.
Technical Solution
expect/actual패턴을 활용한UIApplicationDidReceiveMemoryWarningNotification기반의 iOS 메모리 압력 모니터링 체계 구축- 디코딩된 Bitmap(50MB)과 인코딩된 Data(100MB)를 분리한 Two-Tier LRU Cache 설계로 메모리 효율 극대화
- 메모리 압력 감지 시 비용이 높은 Decoded Bitmap을 우선 삭제하는 Asymmetric Eviction 전략 적용
- Skia Bitmap을
CGImage/UIImage플랫폼 텍스처로 즉시 변환하여 iOS OS 수준의 메모리 가시성 및 관리 권한 복구 - 대용량 이미지 데이터 할당 후
GC.schedule()을 명시적으로 호출하여 Kotlin/Native GC의 휴리스틱 한계 보완
실천 포인트
- KMP iOS 프로젝트에서 이미지 집약적 리스트 구현 시 `expect/actual` 기반의 메모리 경고 리스너 구현 여부 확인 - 캐시 설계 시 재다운로드 비용(Network)과 재디코딩 비용(CPU)을 구분한 계층적 삭제 전략 검토 - 대용량 바이너리 데이터 처리 후 Kotlin/Native GC의 지연 수거 가능성을 고려한 `GC.schedule()` 적용 검토 - Xcode Instruments의 Allocations trace를 통해 메모리 해제 패턴이 Sawtooth 형태인지 검증