KoreaMango 나무

Flutter - 플러터의 메모리 관리 본문

Flutter

Flutter - 플러터의 메모리 관리

KoreaMango 2024. 11. 12. 23:15

 

플러터에서는 어떻게 메모리 관리를 하는지 알아보고자 합니다.

 

Dart는 Class 생성자를 사용하면 heap(힙) 이라고 불리는 메모리에 저장합니다. (Swift랑 똑같네요 :))

 

 

heap의 메모리는 Dart의 VM에서 관리를 하게 됩니다. 

Dart VM은 가비지 컬렉터(쓰레기 수집가?)가 존재해서

객체가 필요할 땐 할당을 해주고, 필요가 없으면 해제를 해줍니다.

 

https://medium.com/flutter/flutter-dont-fear-the-garbage-collector-d69b3ff1ca30

 

Flutter: Don’t Fear the Garbage Collector

Flutter uses Dart as a development language and as a runtime. Dart’s runtime is ever-present, both in debug and release modes, but there…

medium.com

 

Dart의 객체의 유형에는 Disposable Object, Memory-risky Object 가 있습니다.

말 그대로 Disposable Object는 dispose 메서드를 정의하는 모든 객체이구요, Memory-risky Object는 Dispose가 제대로 되지 않거나 가비지 콜렉터가 수행되지 않을 경우 메모리 누수가 되어버리는 객체입니다.

 

Memory-risky Object의 예를 들면 Image 객체에 controller를 연결했는데, Image 객체만 해제되고 controller는 해제되지 않는 경우가 있다고 하네요.

 

 

Garbage collector가 어떻게 일하는지 확인해보겠습니다.

 

Dart Application은 Root Object를 무조건 만드는데요. Root Object는 다른 모든 객체를 직접 또는 간접적으로 참조하고 있습니다.

앱이 실행되었을 때 루트 객체가 할당된 객체를 참조하지 않으면, 해당 객체는 Garbage collector가 수거해 갑니다.

 

그리고 루트에서 어떤 객체로의 참조 시퀀스를 Retaining path라고 합니다. 

객체는 최소한 하나의 Retaining path가 있어야 reachable한 객체라고 할 수 있습니다. 

또한 객체는 이 Retaining path는 여러 개를 가질 수 있습니다.

 

 

그럼 가비지 컬렉터가 메모리 관리 잘해줄 텐데 왜 메모리 누수가 생기는거지? 

라고 생각하실 수 있는데요.

 

가비지 컬렉터는 도달할 수 없는 객체를 처리할 수 있지만 불필요한 객체는 처리할 수 없습니다.

불필요한 객체는 애플리케이션의 역할이죠.

 

잡기 어려운 누수 패턴 중 하나는 클로저 사용과 관련이 있다고 하는데요.

final handler = () => print(myHugeObject.name);
  setHandler(handler);

 

이러한 경우에 클로져 안에 있는 myHugeObject는 가비지 컬렉터가 수집할 수 없다고 하네요.

 

그래서 어떻게 하냐면요. 수명 주기가 짧은 context와 관련된 예시가 있습니다.

 

// BAD: DO NOT DO THIS
// This code is leak prone:
@override
Widget build(BuildContext context) {
  final handler = () => apply(Theme.of(context));
  useHandler(handler);
…

// GOOD
@override
Widget build(BuildContext context) {
  final theme = Theme.of(context);
  final handler = () => apply(theme);
  useHandler(handler);
…

 

이렇게 하면 theme는 누수되지 않고 인스턴스 간에 공유할 수 있게 됩니다.

 

flutter의 메모리 관리에 대한 출처는 아래 링크를 참고했습니다 :)

https://docs.flutter.dev/tools/devtools/memory

 

Use the Memory view

Learn how to use the DevTools memory view.

docs.flutter.dev