Open Hminchae opened 7 months ago
메모리와 관련하여 기초적인 용어와 개념을 먼저 정리하고 넘어가보겠음. 아래 내용은 WWDC18의 Memory Deep Dive 내용을 많이 포함하고 있음..
virtual memory
virtual memory = clean memory + dirty memory
process가 계산을 하다가 메모리에서 데이터를 찾는데, 이 때 virtual memory 라는 것을 두고 virtual memory 에서는 RAM과 disk 공간을 바라봄
virtual memory 부분을 적절한 단위로 나누게 되는데, 이것을 Page 라고 함
이 분할된 공간에 접근하려면 분할된 공간의 주소가 Page Table이라는곳에 저장되고 RAM은 이 Page Table을 보고 디스크 공간에 접근
page out: 물리메모리에 page에 대응하는 데이터가 없어서, 물리메모리에 있는 어느 한 page와 disk에 있는 page랑 swap 해야하는데, 이 때 물리메모리에서 사용하지 않은 공간을 내준다는 의미로 page out이라 함
page in : 위에서 page out 되면서 반대로 디스크 입장에서는 swap 될 때 보내는 page를 의미
앱에서 메모리가 필요하면, 시스템에서 메모리 페이지를 줌(페이징). 이 페이지에는 여러 객체들이 저장되고, 큰 용량의 객체는 여러 페이지에 걸쳐 존재할 수 있다. 한 페이지는 16KB 정도이고, 각 페이지는 write 한 적이 있는지에 따라 앞서 살펴본 clean memory 와 dirty memory 로 나뉘게 됨
한 앱의 전체 메모리 사이즈는 이렇게 계산됨
앱이 할당받을 수 있는 메모리 Footprint에는 제한 한도가 존재하고, 이 한도치를 넘어가면 EXC_RESOURCE_EXCEPTION
발생 -> 다음주제에서 계속
didReceiveMemoryWarning() 핸들링
// AppDelegate.swift
func applicationDidReceiveMemoryWarning(_ application: UIApplication) {
}
cashe.removeAllObjects()
를 사용하여 캐싱을 제거하는게 가장 간편한 방법이라 함Instrument로 메모리 누수 확인하기
아래 같은 시퀀스로 메모리 누수를 확인하고 문제를 해결할 수 있다
만약 앱이 메모리를 너무 많이 사용한다면 iOS는 경고를 보낸다.. crash report 형태의 notifications를 받을 수 있는데 이 리포트는 앞서 적혀있던
EXC_RESOURCE exception type
과MEMORY subtype
등을 포함하는데 앱 메모리가 거의 한계에 이르렀다는 걸 알려준다. 근데 이건 메모리 사용 문제를 발견했다는거지 앱이 종료 되지는 않는다. 메모리 제한은 디바이스에 따라 다르고 앱이 이 제한을 초과하면 iOS가 앱을 완전 종료 시킨다.
EXC_RESOURCE exception
이 에러로 나오게 됨
각 디바이스별로 앱에서 사용할 수 있는 최대 메모리를 스택오버플로우에서 정리해 놓았길래 가져옴
포인터의 크기는 운영체제의 bit수에 따라 달라짐
이미 동호님과 창준님이 아래 이슈에서 정리해주셨기 때문에 넘어가겠음