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
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ü:
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.
Bir çöp toplamaya zorlamayı denediniz mi? –
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. –