İçeriğe geç

Uygulamada bellek sızıntısı: temeller ve nasıl tespit edilir

Orta 30 dk Güncellendi:

Kısa cevap

Bellek sızıntısı, bir uygulamanın belleği kullanıp işi bittikten sonra serbest bırakmaması durumunda oluşur. Sürekli artan bellek tüketimi ve yavaşlama ile kendini gösterir. Bellek izleme araçları ve kod analizi ile tespit edilir, en yaygın nedeni unutulan referanslar olmak üzere nedenin ortadan kaldırılmasıyla çözülür.

Sorun nasıl anlaşılır

  • Uygulamanın bellek tüketimi çalışma sırasında sürekli artar
  • Uygulama zamanla yavaşlar ve kararsız hale gelir
  • Program bellek yetersizliği hatasıyla çöker
  • İşletim sistemi takas (swap) kullanmaya başlar ve donar

En yaygın nedenler

Unutulan referanslar

Nesneler artık gerekli olmasa da bir referans onları işaret etmeye devam ettiği için bellekte kalır. Bu, sızıntıların en yaygın nedenidir.

Kaldırılmayan olay dinleyicileri

Kaldırılmadan eklenen dinleyiciler ve geri çağırma işlevleri nesneleri bellekte tutar. Özellikle uzun süre çalışan uygulamalarda sık görülür.

Sınırsız önbellekler

Sınırı veya giriş süresi dolmayan bir önbellek zamanla kullanılabilir tüm belleği kaplar. Aynısı genel koleksiyonlar için de geçerlidir.

Referans döngüleri

Birbirine referans veren nesneler, çöp toplayıcı (garbage collector) onları temizleyemediğinde bellekte kalabilir. Referans sayımı kullanan dillerde ve ortamlarda döngüler sık sık sızıntı nedeni olur.

Adım adım çözüm

  1. 1

    Bunun bir sızıntı olduğunu doğrulayın

    Uygulamayı başlatın ve bellek tüketimini Görev Yöneticisi (Windows) veya Etkinlik İzleyicisi (macOS) ile izleyin. Bellek zamanla artıyor ve işlemler bittikten sonra düşmüyorsa muhtemelen sızıntı vardır. Başlangıç değerini kaydedin ve aynı işlemi birkaç kez tekrarlayın.

  2. 2

    Artışa neden olan senaryoyu izole edin

    İşlevleri tek tek tekrarlayın (ekran açma, veri yükleme, istek gönderme) ve belleği gözlemleyin. Amaç, sürekli artışa neden olan en küçük adım dizisini bulmaktır. Daha sonra tekrarlayabilmek için adımları not edin.

  3. 3

    Bellek izleme aracını kullanın

    Tarayıcıda DevTools > Memory bölümünü açın ve şüpheli işlemden önce ve sonra heap anlık görüntüsü alın. Görüntüleri karşılaştırın ve bellekte kalan nesneleri arayın. Node.js'te node --inspect ve Chrome DevTools kullanın, .NET'te Visual Studio Diagnostic Tools kullanın.

  4. 4

    Heap anlık görüntüsünü analiz edin

    Araçta nesne listesini boyuta veya örnek sayısına göre sıralayın. Kaldırılması gereken nesnelere dikkat edin. Nesneyi bellekte neyin tuttuğunu görmek için referans zincirlerini (retainers) izleyin.

  5. 5

    Olay dinleyicilerini ve zamanlayıcıları kontrol edin

    Kodda dinleyici eklediğiniz yerleri (addEventListener, on, subscribe) arayın ve bunları kaldırıp kaldırmadığınızı (removeEventListener, off, unsubscribe) kontrol edin. Aynısı setInterval ve setTimeout için de geçerlidir; artık gerekli olmadıklarında clearInterval ve clearTimeout ile durdurulmalıdır.

  6. 6

    Önbellekleri ve koleksiyonları sınırlayın

    Önbellekler için boyut sınırı veya son kullanma süresi kullanın (ör. LRU önbellek). Kontrolsüz büyüyen genel dizilerden ve haritalardan kaçının. Eski girişleri düzenli olarak temizleyin.

  7. 7

    Nedeni ortadan kaldırın ve test edin

    Nedeni bulduktan sonra kodu referansları serbest bırakacak şekilde değiştirin. Aynı testi tekrarlayın ve belleği izleyin: kararlı kalmalıdır. Gerekirse belleğin artmadığını kontrol eden otomatik bir test ekleyin.

Hiçbir şey yardımcı olmazsa

Nedeni bulamıyorsanız şüphelendiğiniz kod bölümünü basitleştirip yeniden test etmeyi düşünün. Bazen sızıntı üçüncü taraf bir kitaplıktan kaynaklanır; güncel olup olmadığını ve bilinen bir sorun olup olmadığını kontrol edin. Üretimde belleği izleme araçlarıyla izleyin ve tüketim sınırı aştığında alarm kurun. Karmaşık durumlar için heap profiler ve bellek ayırma analiz araçları gibi gelişmiş araçları kullanın. Sızıntı yalnızca yük altında ortaya çıkıyorsa birden fazla kullanıcı simülasyonu ile test edin.

Tekrarlanmaması için

  • Dinleyicilerin ve zamanlayıcıların eklendiği yerler için kodu düzenli olarak gözden geçirin
  • Sınırlı önbellekler kullanın ve koleksiyonları temizleyin
  • Üretime almadan önce belleği test edin
  • Üretimde bellek tüketimini izleyin

Ne zaman uzmana başvurmalı

Sızıntı üretimde çökmelere neden oluyorsa veya yeniden oluşturamıyorsanız, analiz için IT desteğine veya daha deneyimli bir geliştiriciye başvurun.

Yazılım ve ürün geliştirme · Özel uygulamalar, SaaS ve 4-8 haftada MVP

Sık sorulan sorular

Uygulamanın bellek sızıntısı mı yoksa sadece yoğun mu olduğunu nasıl anlarım?

Bellek çalışma sırasında sürekli artıyor ve işlemler bittikten sonra serbest bırakılmıyorsa muhtemelen sızıntı vardır. Yoğun bir uygulama daha fazla bellek kullanabilir ancak artık ihtiyaç duymadığında serbest bırakmalıdır.

Bellek sızıntısı güvenlik açısından tehlikeli midir?

Olabilir. Sızıntı kaynak tükenmesine ve sistem çökmesine yol açabilir, saldırganlar bunu hizmet dışı bırakma (DoS) için kullanabilir. Ayrıca hassas veri içeren bellek daha uzun süre erişilebilir kalabilir, bu da bilgi sızıntısı riskini artırır.

Bellek ne sıklıkla kontrol edilmelidir?

Her büyük değişiklikte ve üretimde düzenli olarak kontrol edilmesi önerilir. Otomatik testler sızıntının erken tespit edilmesine yardımcı olabilir.

Paylaş
Çözüm bulamadınız mı?AI BT asistanı 7/24 hizmetinizde. Sorunu anlatın veya hatanın ekran görüntüsünü gönderin, durumunuza özel talimat alın.AI BT asistanına sorun