본문 바로가기

카테고리 없음

Flutter vs Android vs iOS 메모리 관리

반응형

Flutter는 단일스레드 가비지 콜렉션, Android는 메모리 공유 멀티 스레드 GC, iOS는 ARC를 통해 메모리를 관리한다. 자동 해제이지만 리소스가 가장되면 먼저 삭제해야 한다.

 


 

🧠 ARC vs GC 구조 요약

ARC (iOS) vs GC (Android / Flutter)

 

의미 Automatic Reference Counting Garbage Collection
해제 방식 참조 카운트가 0이 되면 즉시 메모리 해제 사용되지 않는 객체를 GC가 주기적으로 수거
언제 작동함? 객체 참조가 사라지는 즉시 GC가 스케줄 따라 수시로 작동 (즉시 아님)
누가 관리함? 컴파일러가 코드에 retain/release 삽입 런타임 GC 엔진이 heap을 스캔
순환참조 방지 직접 weak or unowned 사용 GC가 순환 참조도 스스로 탐지 가능
프레임/성능 영향 참조 해제가 즉시 일어나서 예측 가능성 높음 GC 타이밍 예측 어려움, stop-the-world 가능성 있음
스레드 영향 ARC는 메인/백그라운드 둘 다 작동, 안정적 GC가 메인 스레드에서 돌면 렉 유발 가능 (Flutter 등)

 

 

❗ 차이점: GC 엔진 구조와 타이밍

Android JVM (ART) vs Dart VM (Flutter)

 

GC 알고리즘 Generational GC + Concurrent GC + Region-based GC Generational Scavenger + Mark-Sweep
GC 시점 멀티스레드 기반 → 앱 실행 중 백그라운드에서도 돌 수 있음 단일 스레드(UI thread)에서 실행, stop-the-world 발생 가능
스레드 Java는 멀티스레드 환경 (GC도 별도 스레드) Dart는 기본적으로 단일 스레드 모델
GC 타이밍 최적화 훨씬 공격적이고 고도화됨 (Android 10 이후 매우 정교함) 더 단순하지만 프레임 드롭 위험이 있음 (GC가 UI 스레드 차단할 수 있음)

 

 

플랫폼스레드 모델비고

Android (Java/Kotlin) 멀티스레드 (JVM 기반) Handler, Thread, Executor, Coroutine
Flutter (Dart) 단일 스레드 (메인 isolate) + background isolate spawn해서 병렬 처리 가능, GC는 메인 isolate에서 동작
iOS (Swift/ObjC) 멀티스레드 (GCD, OperationQueue) 스레드/큐 생성 자유롭고, UI는 메인 스레드 전용

 

반응형