Flutter DevTools ile Memory Leak Bulma ve İzleme

Flutter uygulamalarında bellek sızıntısı (memory leak) sık karşılaşılan bir sorundur. Özellikle animasyonlar, stream'ler veya global değişkenler yanlış yönetilince bellek hiç boşalmaz ve uygulama yavaşlar. DevTools Profiler bu sorunları görsel olarak bulmanın en kolay yoludur.

Bellek sızıntısının tipik nedenleri arasında dispose edilmeyen controller'lar, kapatılmayan stream'ler ve callback'lerde tuttuğumuz referanslar vardır. DevTools'u açmak için terminalden `flutter pub global activate devtools` sonra `devtools` yazarsın; tarayıcıda açılır. Uygulamayı çalıştırırken DevTools'a bağlanıp Memory sekmesine gidersin.

Burada pratik bir örnek: bir StatefulWidget'ta stream dinleyen kod yazıyoruz ve DevTools ile sızıntıyı göreceğiz.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1import 'package:flutter/material.dart';
2
3class MemoryLeakDemo extends StatefulWidget {
4@override
5State<MemoryLeakDemo> createState() => _MemoryLeakDemoState();
6}
7
8class _MemoryLeakDemoState extends State<MemoryLeakDemo> {
9late StreamSubscription _subscription;
10List<int> dataList = [];
11
12@override
13void initState() {
14super.initState();
15// YANLIŞ: subscription dispose edilmiyor
16_subscription = Stream.periodic(Duration(milliseconds: 100), (i) => i).listen((event) {
17setState(() {
18dataList.add(event);
19if (dataList.length > 1000) dataList.removeAt(0);
20});
21});
22}
23
24@override
25void dispose() {
26_subscription.cancel(); // DOĞRU: bunu mutlaka ekle
27dataList.clear();
28super.dispose();
29}
30
31@override
32Widget build(BuildContext context) {
33return Scaffold(
34appBar: AppBar(title: Text('Memory Test')),
35body: Center(
36child: Text('Veri Sayısı: ${dataList.length}'),
37),
38);
39}
40}

Kodu çalıştırıp DevTools Memory sekmesinde "Take Screenshot" butonuna basarsan, heap (bellek yığını) görüntüsünü alırsın. Dispose etmeden çıkış yaparsanız, bellek arttığını göreceksin. Dispose çağrılırsa stabil kalır.

Sık yapılan hatalar: AnimationController'ı dispose etmemek, provider veya GetX gibi state management'ta listener'ları temizlememek, ve global Stream'ler oluşturmak. Kod yazdıktan sonra her zaman DevTools ile test et; bellek grafiği düz kalmalı, çöp toplayıcı (garbage collector) zaman zaman onu temizlemeli ama sürekli artmamalı.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz