- 힙메모리 분석 - WWDC242024년 06월 15일
- 2료일
- 작성자
- 2024.06.15.:15
이 글은
https://www.youtube.com/watch?v=X_JYRz-Hd0o
유튜브의 wwdc24영상을 다 챙겨보면서 이건 정리할 필요가 잇따고 생각을 하여 정리를하고 있슴다.
앱이 시작하면 가상메모리의 빈 주소 공간을 얻는다. -> 앱이 시작 되면 시스템이 Main Executable, 연결된 라이브러리들을 로드하고 디스크의 읽기전용 리소스 영역에 매핑한다. -> 앱이 실행되면 각 스레드의 로컬 및 임시 변수저장에 대한 스택영역도 사용이 가능해진다. 동적 메모리는 힙이라는 공간에 저장된다.
힙
3
힙은 하나의 메모리블록이 아니라 multiple 가상 메모리 영역으로 구성된다. 각 영역들은 개별 할당으로 구분된다. 내부적으로 16KB메모리 페이지로 구성되어있다. 총 3가지 상태가 있는데, 아직 기록되어있지 않은 Clean, 앱이 최근에 쓴 메모리인 Dirty(그래서 한동안 사용되지 않을때도 버릴수가 없다. 즉 page out 이 불가!), Swapped 영역은 메모리 부족이 있을때, 시스템이 메모리를 압축하거나 디스크에 기록하여 교체한다고 한다. 이 중 swapped, dirty만이 앱의 메모리공간을 차지하고 대부분의 앱에서 힙은 이 두공간으로 이루어진다.그 전에 Swapped와 dirty를 좀더 자세히 이해하기 위해서는 Compressed Memory를 알아야한다.
Compressed Memory
기존 컴퓨터 OS수업을 들었던 사람이라면 페이징 swap을 공부했을 것이다. Page Fault(접근하려는 메모리 위치가 물리적 메모리 테이블에 없을때, HDD등 디스크에 접근)발생하면 디스크로부터 필요한 메모리를 찾아 물리적 메모리에 로드하는데 이 과정에서 Swapping이 이루어진다. 그런데 iOS등 모바일 디바이스에서는 대부분의 데이터가 휘발성으로 디스크에 큰 의미가 없다. 마침 CPU도 엄청나게 발전했기에 Compressed Memory방식을 통해 실제 Ram보다 더 많은 공간을 사용하는 방식을 사용한다. 메모리의 read/write는 CPU클락속도를 여전히 못따라와 불균형이 발생하는데 이것도 이방식을 통하면 극복할 수 있다.
결국 Inactive인건 압축해서 공간을 더 만들께. 굳이 디스크 접근 필요없어.!! 아직까지 아리송하다... 좀더 딥 다이브 해봅자!
1. 메모리 압축은 어떻게 하는데?
Wkdm알고리즘을 사용한다. 32 bit data 16개로 이루어진 디렉토리와 압축된 결과를 쓸 메모리 공간만 있으면 압축할 대상의 크기에 상관없이 압축을 할 수 있따. 압축할 데이터를 한번만 읽어 들이면 되어 적은메모리를 사용하여 빠르게 수행할 수 있다고 한다.
2. 압축할 페이지는 어떻게 정하는데?
LRU(Least Recently Used) 가장 오래전에 사용된 순서로 정한다고 한다.
3. 얼마나 압축을 할건데? 또 압축하는데 시간이 디스크 접근보다 얼마나 빠른데?
Wkdm알고리즘은 50%이상 압축을 한다고 한다. 페이징 스와핑보다 빨라야하잖아... 지직거리는 것을 없애려면. 애플에서 준 자료에 따르면 4KB 페이지 하나 압축하는데 수백만분의 수초라고 한다.
4. 전력소모는?더 심하면 핸드폰 배터리...ISSUE!!
페이지들을 할당하는데 걸리는 시간을 줄이기에 응답성도 향상되고 CPU도 작업을 더 빨리 끝내 대기모드로 들어가 전력소모가 줄어든다.
5. 멀티코어로 해?ㅇㅇ
그러면 힙에는 모가 저장되는데?
그냥 예상답변으로는 class, reference type이 됩니다. 하겟지? 예전의 나는 그랫었다.
그러면 struct는 절대 힙에 저장이 안되나요? nono 만약 struct안에 class인스턴스가 존재한다면?
String은 가변적이므로 heap에 저장되고 UIFont또한 class로서 힙에 저장된다. 하지만 Label은 struct로 구현했다. 그렇기에 stack에는 해당 text와 Font두개가 담기지만 각각이 heap에 저장되어 2개의 ARC관리 필요. 만약 이걸 class Label로 했다면?
오히려 더 좋다. 그래서 Struct를 쓸때는 참조타입을 최소화 해야한다.
그러며 value 타입은 절대 heap에 저장이 안되나요? nono 컴파일타임에 크기를 정확하게 알수 없는 collection type들은 힙에 저장된다.
Malloc
- 앱이 수명이 긴 메모리를 동적으로 할당 가능하다. 이 뜻은 명시적으로 해제될때까지 할당이 유지됨. 생성된 곳의 코드를 넘어서까지도 지속이 된다.
- 최소 할당 크기는 16바이트. 내가 2바이트만 필요해도 16바이트를 할당한다.
- Free 즉 해제되면 할당은 0으로 된다.
클래스의 인스턴스를 찍을때 이 과정에서 malloc도 포함되어있는것이였던것.
- mallocStackLogging은 할당에 대한 호출 스택과 타임스탬프 기록. 디버깅할때 이걸 이용하면 메모리 할당 위치, 시기 확인 ㄱㄴ
https://hasensprung.tistory.com/181
[Swift] Struct와 Class를 메모리 원리부터 자세하게 비교해보자
Understanding Swift Performance - WWDC16 - Videos - Apple Developer In this advanced session, find out how structs, classes, protocols, and generics are implemented in Swift. Learn about their relative... developer.apple.com WWDC Understanding Swift Perfor
hasensprung.tistory.com
'면접준비' 카테고리의 다른 글
CLMonitor (1) 2024.10.22 Swift Performance-wwdc24 (0) 2024.06.17 Uniform type Identifiers (1) 2024.04.18 매크로(Macros) (1) 2024.03.07 초기화(initialization.. 편의? 지정?) (0) 2024.03.05 다음글이전글이전 글이 없습니다.댓글