Memory와 ARC, GC

박성민·2021년 2월 2일
0

면접 준비

목록 보기
2/6

메모리 영역

1. 코드 영역

작성한 소스코드가 기계어 형태로 저장
컴파일 타임에 결정되고 , 중간에 코드가 변경되지 않도록 read-only 형태로 저장

2. 데이터 영역

전역변수, static 변수 저장
프로그램 시작과 동시에 할당되고, 프로그램이 종료 되어야 메모리가 해제
실행 도중 변수 값이 변경될 수 있으니 read-write 로 저장

3. 힙 영역

프로그래머가 할당/해제 하는 영역 (동적 할당)
사용하고 난 후에는 반드시 메모리 해제를 해줘야한다. 그렇지 않으면 memory leak이 발생
→ swift는 ARC가 자동으로 해제해줌
런타임 시 결정되기 때문에 데이터 크기가 확실하지 않을 때 사용
class, 클로저 같은 참조 타입 + String 할당

4. 스택 영역

함수 호출 시 함수의 지역변수, 매개변수, 리턴 값 저장
함수가 종료되면 메모리도 해제
컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다

앱 메모리

  • Dirty 메모리는 객체 등 앱에서 수정한 데이터들과, 프레임워크 dirty 메모리 등을 포함합니다.
  • Clean 메모리는 이미지, 프레임워크 데이터 등을 포함합니다.
  • Compressed memory는 문자 그대로 압축된 메모리를 의미하는데, 일정 기간 동안 특정 메모리 영역에 접근하지 않으면, 시스템이 해당 메모리 페이지들을 압축하고, 다시 접근할 때 압축 해제합니다. iOS는 Memory compressor를 이용하여 이런 압축 또는 압축 해제 작업들을 수행합니다.
  • 앱이 할당 받을 수 있는 메모리 Footprint에는 제한 한도가 존재하며, 이 한도치를 넘어가면 EXC_RESOURCE_EXCEPTION 익셉션이 발생합니다.

footprint?
특정 하드웨어나 소프트웨어 단위가 차지하고 있는 공간의 크기

ARC?

컴파일 시 코드를 분석해서 컴파일러가 프로그래머 대신에 자동으로 retain, release코드를 적절한 위치에 넣어줍니다.

장점

  • 참조된 횟수를 추적해 더 이상 참조되지 않는 인스턴스를 메모리에서 해제해줍니다.
  • ARC는 객체가 필요하지 않은 경우 즉시 할당을 해제해줍니다.
  • 백그라운드 처리가 없으므로 모바일 장치와 같은 저전력 시스템에서 더 효율적입니다.

단점

  • Retain cycle을 관리할 수 없습니다.

Garbage Collection

프로그램 실행 중(Runtime)에 동적으로 감시하고 있다가, 더 이상 사용할 필요가 없다고 여겨지는 것을 소멸(해제) 시킵니다.

장점

  • GC는 retain cycle을 포함한 전체 object graph를 정리할 수 있습니다.
  • GC는 백그라운드에서 발생하므로 일반 애플리케이션 흐름의 일부로 수행되는 메모리 관리 작업이 줄어 듭니다.

단점

  • GC는 백그라운드에서 발생하기 때문에 객체 릴리스의 정확한 시간은 알 수 없습니다.
  • GC가 발생하면 응용 프로그램의 다른 스레드가 일시적으로 보류 될 수 있습니다.
  • 런타임에 객체를 추적, 해제하는 과정에서 오버헤드가 발생합니다.

참조 및 출처

profile
iOS시작~

0개의 댓글