- 왜 메모리를 줄여야 하는가?
- 당연히 유저 경험 상승을 위해서다.
- 모든 메모리가 동일하게 생성되지는 않는다.
- Page: 가상 메모리의 단위
- 일반적으로 16KB
- 클린 상태와 더티 상태로 나뉨
- 첫 할당 때는 클린
- 메모리 풋프린트
- Clean, Compressed, Dirty로 나뉨
- Clean: 메모리에서 없어질 수 있는 데이터
- Dirty: 앱에 의해 사용된 메모리
- 힙 할당
- 디코딩 된 이미지
- 프레임워크의 데이터 영역
- Compressed
- 메모리 워닝 신호를 받으면, 더티 영역을 정리해야 함
- 캐싱: CPU 시간과 메모리 사이의 트레이드 오프
- Compressing됨을 기억하라
- NSCache를 Dictionary 대신 사용하라
- 메모리 제한은 디바이스마다 다르다.
- App에 비해 extension은 메모리 제한이 낮다.
- 메모리 풋프린트 프로파일링 툴
- Xcode
- memory gauge
- memory debugger
- memgraph export 가능
- 이렇게 내보낸 memgraph는 vmmap 혹은 leak, heap, malloc_history 같은 툴로 확인 가능
- Xcode 10부터는 Resource_exception을 캐치해줌
- Instrument(Allocations, Leaks, VM Tracker, Virtual Memory Trace)
- 이미지 다루기
- 이미지는 이미지 크기에 따라 메모리 사용량이 결정된다 -> 파일 크기랑은 무관하다.
- 이미지는 로드 -> 디코드 -> 렌더 과정을 거치면서 파일일 때 크기보다 용량이 커진다.
- SRGB 기준 픽셀당 4바이트, 와이드 포맷은 8바이트, Luminance&alpha는 2바이트, 알파만 다루는 것은 1바이트
- 포맷을 고르지 말고, 포맷에 따라 자동으로 동작이 선택되도록 하라
- UIGraphicsBeginImageContextWithOptions는 그만 쓰라.
- UIGraphicsImageRenderer를 써라
- 다운 샘플링
- UIImage는 직접 다루기 무겁다.
- ImageIO를 쓰면 더티 메모리를 만들지 않고도 이미지 처리가 용이하다.
- 백그라운드 최적화
- 보이지 않는 큰 리소스는 해제해야 한다.
- App이 백그라운드로 갈 때 이것들을 해제하라.
- 뷰가 나타나고 사라질 때도 마찬가지다.
- 결론
- 메모리는 제한되고 공유되는 자원이다.
- 메모리 사용량을 검사하라
- 시스템이 적절한 포맷을 설정하도록 하라
- Downsampling은 imageIO를 사용하라
- 스크린에서 사라지면 큰 리소스는 해제하라
- 메모리 그래프를 통해서 후에 메모리 사용량을 줄여나가라