26

Uczę się wykorzystania pamięci za pomocą MAT w Eclipse. Chociaż natknąłem się na dziwny problem. Odłóż na bok ciężkie aplikacje, zacząłem od najbardziej łagodnej aplikacji "Hello World". Otrzymuję to jako statystyki sterty na Nexus 5, ART runtime, Lollipop 5.0.1.Nieoczekiwane sterty na Hello World Android APP

ID: 1
Heap Size: 25.429 MB
Przydzielone: 15,257 MB
bezpłatny: 10,172 MB
% Używane: 60%
# Przedmioty : 43487

Moja Heap wysypisko daje mi 3 Pamięć podejrzanych wyciek: Przegląd

„Nie można pisać wykres kołowy z powodu niskiej reputacji.”

problem podejrzanego 1

klasy "android.content.res.Resources", załadowanych przez "", mieści 10,166,936 (38,00%) bajtów. Pamięć jest zgromadzona w jednym egzemplarzu "android.util.LongSparseArray []" załadowanym przez "".

słowa kluczowe android.util.LongSparseArray [] android.content.res.Resources

problem podejrzanego 2

209 powtórzenia "android.graphics.NinePatch", obciążonego "" zajmują 5,679,088 (21,22%) bajtów. Przykłady te są odniesienia z jednego wystąpienia "java.lang.Object []" ładowany "" kluczowe java.lang.Object [] android.graphics.NinePatch

problem podejrzanego 3

8 wystąpień "java.lang.reflect.ArtMethod []", ładowanych przez "" zajmuje 3 630 376 (13,57%) bajtów. Największe przypadki: • java.lang.reflect.ArtMethod [62114] @ 0x70b19178 - 1 888 776 (7.06%) bajtów. • java.lang.reflect.ArtMethod [21798] @ 0x706f5a78 - 782,800 (2,93%) bajtów. • java.lang.reflect.ArtMethod [24079] @ 0x70a9db88 - 546,976 (2,04%) bajtów. Słowa kluczowe java.lang.reflect.ArtMethod []

To wszystko za pomocą prostego kodu:

import android.app.Activity; 
import android.os.Bundle; 

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

}

pytania

  1. Dlaczego liczby kupie takie duże. ? Również na marginesie aplikacja zużywała 52 MB pamięci RAM w systemie.
  2. Gdzie są te 209 wystąpienia NinePatch? Po prostu stworzyłem projekt, robiąc "Utwórz nowy projekt" w Eclipse?
  3. Pierwszy wyciek podejrzany o zasoby, Pojawia się cały czas w mojej analizie aplikacji. Czy to naprawdę jest podejrzany?
  4. Co to jest ArtMethod? Czy musi coś zrobić z środowiskiem wykonawczym ART?
+0

Nie sądzę, że jest to funkcja systemu operacyjnego. Dla mojej aplikacji istnieje wysoki przydział sterty dla "android.content.res.Resources" i "android.graphics.NinePatch" na urządzeniach xhdpi/xxhdpi nawet na KitKat. Zobacz to pytanie, aby uzyskać więcej informacji: http://stackoverflow.com/q/30980112/3446669 – GunnerFan

Odpowiedz

7

W Lollipop domyślnym środowiskiem wykonawczym jest ART, tj. Android Run Time. który jest używany zamiast czasu pracy Dalvik jest używany w starszych wersjach Androida. W KitKat google opublikował eksperymentalną wersję ART, aby uzyskać opinie użytkowników. W języku dalvik używana jest kompilacja JIT (just in time), oznacza to, że podczas otwierania aplikacji tylko kod dex jest konwertowany na kod obiektowy. Ale w ART w czasie instalacji tylko kod dex jest konwertowany na kod obiektowy (tj. AOT przed kompilacją czasu). Rozmiar tego kodu obiektowego jest bardziej w porównaniu do kodu dex, więc ART potrzebuje więcej pamięci RAM niż Dalvik, ponieważ jego aplikacja AOT działa szybciej w ART w porównaniu Dalvik.

+1

W jaki sposób to wyjaśnia wystąpienia wystąpień NinePatch ..? –

0

Wczoraj też mam do czynienia z tym problemem. W twoim logu słowem kluczowym jest "NinePatch". W moim przypadku przyczyną był "fałszywy" cień - malutki obraz z kanałem alfa, który wyzwalał wyciek zasobów. To kosztuje około 60mb wyciekanej pamięci dla mnie.