2015-04-15 37 views
7

Bellek sızıntılarını incelemek ve bunları incelemek için bellek analiz aracı kullanarak çalışıyorum. Yani, bir uygulama olarak, anonim bir iç sınıfın faaliyeti referans aldığı için bir faaliyeti akıtan kod takip ediyorum. Burada yukarıdaki sızıntı bellek analizörü görüntüleri (6 rotasyonları) sahipBellek sızıntısı Sonlandırıcı hatası

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    exampleOne(); 
    } 

    private void exampleOne() { 
    new Thread() { 
     @Override 
     public void run() { 
     while (true) { 
      SystemClock.sleep(1000); 
     } 
     } 
    }.start(); 
    } 
} 

: İşte kod 6 Rotations of the activity. enter image description here

Bu dış bir örtük referansa sahip 6 çalışan iş parçacığı olduğunu açıkça belli etkinlik ve böylece çöp toplanmasını önler. Orada dış aktiviteye ilişkin referans var ve GC serbestçe parçacığı tarafından engellenmiş olmadan Etkinlik nesneleri geri böylece ben, sınıf statik yaptık İşte

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    exampleTwo(); 
    } 

    private void exampleTwo() { 
    new MyThread().start(); 
    } 

    private static class MyThread extends Thread { 
    @Override 
    public void run() { 
     while (true) { 
     SystemClock.sleep(1000); 
     } 
    } 
    } 
} 

:

Şimdi, kod aşağıdakileri dikkate sınıf.

İşte aynı MAT görüntü:

enter image description here

6 Rotations again.

Ben 5 sonlandırıcı başvuruları vardır ekran görüntüleri, ikinci sette ilgili karışıklığı var. Ben bu konuda googled ve JVM GCed olmak üzereyken nesneleri referans kuyruğa eklediğini öğrendim. Bunun olmasına rağmen, bu değişikliklerin MAT'de mevcut olmayacağını bekledim çünkü GC'nin bu referansları boşaltmak için çok zaman alacağını düşünmüyorum. 13 rotasyon kullansam bile, sonuç 12 finalizer referansıyla aynıdır. Yanılıyor olabilirim ama MAT'nin sadece 1 tane Aktivite nesnesini göstereceğini düşündüm, çünkü diğerleri GCed olmalıydı. Sonlandırma referans kuyruğu ile ilgili herhangi bir yardım ve çöp toplama sırasında devam eden süreç takdir edilecektir. Teşekkürler.

+0

Bir çöp toplamaya zorlamayı denediniz mi? –

+0

Eh, hayır zorlama denemedim. İkinci durum için, GC'nin otomatik olarak hafızayı geri alacağını düşünüyorum çünkü bunu yapmayı engelleyen hiçbir şey kalmadı. Nesneleri finalizer kuyruğuna koymak, hafızanın geri kazanılmaya hazır olduğunu gösterir, ancak karışıklığım MAT'ye yansımadığıdır. –

cevap

3

enter image description here

Seç Finalizer bakış. Çalıştırmak için sonleştiriciyi bekleyen nesnelerin sayısı ve sonlandırıcı iş parçacığının diğer ilgili bilgileri hakkında bilgi verir.