본문 바로가기

Personal Posting/Flutter

Flutter에서의 메모리릭

DALL·E 2025-01-06 13.08.36 Flutter Memory leak

 

Flutter 애플리케이션에서 메모리 누수란?

메모리 누수는 프로그램이 더 이상 필요하지 않은 메모리를 계속 점유하는 현상으로, 애플리케이션이 불필요하게 많은 메모리를 사용하게 만들어 성능 저하, 충돌, 그리고 나쁜 사용자 경험을 초래할 수 있다.

 

1. 메모리 누수 (Memory Leak) 이란?

메모리 누수는 프로그램이 특정 메모리 공간을 더 이상 참조하지 않으면서도, 가비지 컬렉터가 이를 회수하지 못하는 상황을 의미합니다. Flutter에서 메모리 누수는 아래와 같은 상황에서 발생할 수 있다.

  • 캐싱된 객체: 사용되지 않는 객체가 메모리에 남아 있는 경우
  • 리스너 제거 실패: 리스너를 적절히 제거하지 않아 객체가 계속 참조되는 경우
  • 스트림(Stream) 관리 실: 스트림 구독을 제대로 취소하지 않아서 백그라운드에서 계속 실행되며 메모리를 소비하는 경우
  • 대용량 이미지 및 비디오: 큰 파일을 로드한 후 해제하지 않은 경우

2. Flutter에서 메모리 누수가 발생하는 주요 원인

  1) 사용되지 않는 객체

    - 닫히지 않은 스트림이나 제거되지 않은 객체는 메모리에 남아 공간을 차지한다. 아래는 예제 코드이다.

import 'dart:async';
void main() {
  StreamController<String> _streamSub = StreamController<String>();
  _streamSub.add("Flutter, Devs!");
  _streamSub.stream.listen((data) {
    print("stream data: $data");
  });
}

 

    위 코드에서 스트림을 닫지 않으면 메모리 누수를 유발할 수 있다.

 

  2) 스트림 구독 취소 실패

    - 스트림은 비동기 이벤트를 처리하는 데 유용하지만, 구독을 취소하지 않으면 백그라운드에서 계속 실행되어 메모리를 소비할 수 있다.

 

  3) 전역 변수

    - 전역 변수에 객체나 위젯 참조를 저장하면 가비지 컬렉터가 이를 제거하지 못해 메모리 누수가 발생할 수 있다.

 

  4) 대용량 이미지 및 비디오

    - 큰 이미지나 비디오 파일은 많은 메모리를 차지하며, 사용 후 해제하지 않으면 문제가 된다.

 

  5) 위젯 트리

    - 특히 StatefulWidget을 잘못 배치하거나, 불필요한 상태를 유지하면 위젯 트리가 필요 없는 객체를 계속 참조해 메모리 누수를 초래할 수 있다.

 

3. Flutter에서 메모리 누수 탐지 방법

  1) Flutter DevTools

    - Flutter DevTools는 성능 분석과 디버깅 도구로, 아래의 명령어로 애플리케이션의 메모리 사용량을 모니터링할 수 있다.

flutter pub global run devtools

 

  2) 힙 스냅샷(Heap Snapshots)

    - 특정 시점의 메모리 상태를 저장하여 가비지 컬렉션되지 않은 객체를 식별할 수 있다.

 

  3) 코드 분석

    - 객체와 컨트롤러가 적절히 해제되었는지 확인한다. 특히 컨트롤러는 Flutter에서 가장 흔한 누수 원인 중 하나이다.

 

4. Flutter에서 메모리 누수를 방지하는 방법

  1) 객체 해제

    - 더 이상 필요하지 않은 객체는 아래와 같이 dispose() 메서드를 사용해 제거해야 한다.

@override
void dispose() {
  myController.dispose();
  super.dispose();
}

 

  2) 스트림 관리

    - 스트림 구독은 사용이 끝나면 반드시 취소해야 한다.

StreamSubscription subscription = myStream.listen((event) {});

@override
void dispose() {
  subscription.cancel();
  super.dispose();
}

 

  3) 효율적인 이미지 및 비디오 처리

    - 대용량 미디어 파일은 flutter_cache_manager 패키지를 활용해 캐싱하고 효율적으로 관리할 수 있다.

 

  4) 프로파일링 도구 활용

    - Flutter DevTools와 같은 도구를 사용하여 애플리케이션의 메모리 사용량을 분석하고 누수를 찾아 수정한다.

 

  5) 백그라운드 스레드에서 Flutter 객체 참조 피하기

    - 백그라운드 스레드에 Flutter 객체를 직접 참조하는 대신, 약한 참조(Weak References)나 Isolate를 활용한다.

 

5. 결론

Flutter 애플리케이션에서의 메모리 관리 문제는 성능 저하와 충돌로 이어질 수 있지만, 올바른 방법과 도구를 활용하면 방지할 수 있다.

  • 불필요한 객체는 즉시 해제
  • 스트림 구독은 적시에 취소
  • 대용량 파일은 효율적으로 로드 및 캐싱
  • DevTools와 같은 도구로 정기적으로 분석

편의성, 사용성도 물론 중요하지만 결국 애플리케이션, 아니 프로그램의 근본은 안정성이라고 생각한다. 작은 물줄기에  댐이 무너진다는 말이 있듯이 우리 모두 작은 누수 포인트도 놓치지 않아 안정적인 애플리케이션을 만드는 개발자가 되길 바라며 블로그 정리를 마친다.

 

아래 링크의 포스팅을 참고하여 정리한 내용입니다. 원문을 확인하고 싶으시면 아래 링크를 확인해주세요.

출처 - https://flutterexperts.com/explore-memory-leaks-in-flutter/

'Personal Posting > Flutter' 카테고리의 다른 글

Flutter에서 Key의 역할과 중요성  (0) 2025.01.07
Flutter MVVM 구조  (0) 2025.01.06
Flutter 스피드 다이얼 구현  (0) 2025.01.06
Flutter 웹 로딩 속도 최적화  (1) 2025.01.06
Flutter에서 Hooks 사용하기  (0) 2025.01.06