아래 글들에서 언급되는 low memory 로 인해 앱이 크래시되는 것, 없는 일 아닙니다. 다만 그 과정에 많은 유언비어들이 유포되고 있어 바로잡고자 글을 씁니다.
1가의 램이 있다고 가정해봅시다. 그러면 기본적으로 os가 돌아가는데만 200메가 전후로 메모리를 잡아먹습니다(최신버전일수록 더 먹고, 과거 기기일수록 특정 부분을 배제하기에 더 적게 먹습니다.
유언비어 1. 앱 하나당 메모리를 쓸 수 있는 용량이 정해져 있다? 그런거 없습니다. OS가 쓰고 남은 전체 영역을 한 앱에서 전부다 쓰는것도 가능합니다. 흔한 예로 대표적인 아이폰 게임인 인피니티 블레이드의 경우 메모리 500메가씩 먹는 일도 흔합니다. 애초에 그런 일괄적인 상한선을 두는 멍청한 짓을 할 리가 없다는 거죠.
유언비어 2. 로우 메모리로 인한 크래시는 램 증설이 답이다? 전혀, 그렇지 않습니다. 이 부분의 이해를 위해서는 한 가지를 알아야 하는데, 첫째는 '로우 메모리 워닝' 이라는 부분입니다. iOS는 늘 메모리 관련 모니터링을 하고 있습니다.
사용 가능한 메모리가 700메가인데 a앱에서 50메가를 쓰고있고 b앱에서 120메가를 쓰고 있고 언제 실행되었고 언제 백그라운드로 내려갔고 멀티태스킹으로 음악 등을 들려주고 있고 등등 많은 정보를 통합관리합니다.
iOS 메모리 관리의 핵심은, 이 모니터링과 연계되는 '경고' 기능입니다.
잔여 메모리가 충분할 때는 특정 앱이 메모리를 얼마나 쓰던 OS는 간섭하지 않습니다.
정확한 수치는 알 수 없으나 메모리 잔량이 약 10%가량 남았을 때, 현재 살아있는 모든 앱들에게 레벨 1의 경고를 보냅니다. 특히나 현재 프론트로 실행되고 있는 앱에겐 더 특별한 의미로 가가게 됩니다.
이 레벨 1의 의미를 의역하면 '메모리가 거의 한계에 도달했는데, 아직 널 죽여서까지 해결할 만한 수준은 아니고 다른애들 죽여서라도 조금씩 확보해 볼테니 알아두고, 너도 조심해.' 정도가 됩니다.
이때도 정신 못차리고 계속 메모리 쓰는 짓을 한다면, 레벨 2의 경고를 보냅니다. '이제 정말 위험한데, 지금 하고 있는 짓을 당장 멈추거나 자체적으로 메모리 확보를 해주지 않으면 널 죽일지도 몰라, 마지막 경고다?' 라구요.
이때도 아직 앱이 크래시되는 단계는 아닙니다. 그저 정말 최후통첩일 뿐이죠. 이때라도 확실히 대처해주면 앱은 살아있을 수 있습니다.
결국 이런 대처들을 확실히 해준다면 앱 메모리가 700메가까지 한계로 끌어쓰고도 크래시되지 않을 수 있다는 겁니다. 만약 하나의 앱이 그 이상의 메모리를 자연스럽고 상시적으로 필요로 한다? 그건 그 앱이 설계부터 쓰레기라는 것을 의미합니다. 아무리 복잡한 앱이라도(설령 게임이라도) 2-300메가가 넘어가는 메모리를 필요로 한다면 그건 모바일을 전혀 이해하지 않고 발로 만든 게임이거나 정말 드물게는 인피니티블레이드급으로 화려한 게임일 가능성도 있을 수는 있겠죠. 어쨌든! 로우메모리는 그 자체로 크래시의 원인이 될수는 없다는 소립니다. 경고를 두번이나 해준다구요.(사실 잘만 만들면 애초에 경고가 뜨거나 말거나 크래시되는일은 거의 없습니다)
유언비어 3. 크래시리포트에 로우메모리 기록이 있으면, 그 앱 사용 중 발생한 문제다? 아닙니다. 백그라운드로 내려간 상태에서 다른 앱에 의해 메모리가 부족해져 강제 크래시된 경우도 해당 로그가 남습니다.
유언비어 4. 메모리가 충분히 높으면 그런 일이 없을거다? 메모리가 10기가가 되던 설령 한 1테라쯤 된다고 해도 위의 문제는 완전히 동일하게 일어납니다. 다만 그것이 발생하는 시간이 약간씩 늦춰질 뿐입니다.
현 하드웨어 구조 하에서 램을 높여봐야 4기가 정도가 한계일텐데 그렇게 되봐야 아무 의미가 없다는 것이고, 정말로 1테라쯤 되게 만들어서 한 몇주에 한번씩 폰 껐다 켜면 로우메모리 경고 자체가 발생 안하게 만든다 해도 그 부피가 감당이 될지 모르겠군요.