21

Piszę procedurę synchronizacji dużej liczby kontaktów z bazą danych kontaktów systemu Android. Pobieranie działa dobrze dla około 700 kontaktów, po których jestem konsekwentnie otrzymujący błąd sterty pamięci, który wywołuje nieskończoną liczbę instrukcji GC i kończy się ponowne uruchamianie telefonu. Mam problem z HTC.Android dalvikvm-heap: Zacisk docelowy GC sterty

Sprawdziłem rozmiar sterty aplikacji za pomocą narzędzia alokacji sterty z DDMS, a także wyodrębniono plik hprof przy użyciu opcji Debug.dumpHprofData. Oba dzienniki wskazywały, że rozmiar sterty wynosi około 2,4 MB.

jednak uzyskać następujące dzienniki, które wskazują, że wielkość sterty jest bardziej że 32.MB

dalvikvm-heap(92): Clamp target GC heap from 33.999MB to 32.000MB 
dalvikvm(92): GC_FOR_MALLOC freed 2 objects/48 bytes in 313ms 

miałem wstawiony poniższych stwierdzeń dziennika w pętli, gdzie moje contatcs pobieranie logiki został napisany.

Log.e("Memory", "free mem =" +runtime.freeMemory()); 
Log.e("Memory", "total memory =" +runtime.totalMemory()); 

Są to początkowe i końcowe wartości rachunku drukowany

--------------------------------------------------------------- 
11-11 12:56:04.168: ERROR/Memory(25132): free mem =871248 
11-11 12:56:04.168: ERROR/Memory(25132): total memory =4202464 

--------------------------------------------------------------- 

11-11 13:01:55.408: ERROR/Memory(25132): free mem =891640 
11-11 13:01:55.408: ERROR/Memory(25132): total memory =4726752 

--------------------------------------------------------------- 

Oznacza to, że apperently nie ma wycieków pamięci obecne w logice synchronizację kontaktów.

Czy ktoś może dać mi znać, dlaczego wielkość sterty wzrosła (do 32.00Mb) do tego stopnia, że ​​urządzenie ponownie się uruchamia? Jestem nowy na Androida i Javę, więc proszę bardzo łatwo:) .....

+1

Czy można połączyć lub wkleić odpowiedni kod źródłowy? –

+0

Pomocne będzie obejrzenie kodu. Bez względu na to, dlaczego chcesz przechowywać wszystkie kontakty w pamięci? Zwykle podczas synchronizowania kontaktów ustawia się kursor i grupuje zapytanie. Prawdopodobnie nie musisz jednocześnie przechowywać wszystkich kontaktów w pamięci. Czy coś mi brakuje? – Guy

+1

Czy identyfikator procesu dla linii dalvikvm w dzienniku to proces? – Ifor

Odpowiedz

8

Chociaż nie jest to najlepsza odpowiedź, zdecydowanie polecam obejrzeć film z wykładu Memory management for Android Apps na Google IO 2011. To świetna robota wyjaśniająca, jak zarządzać pamięcią i co oznaczają wiadomości, które widzisz.

2

Musisz wysłać swój kod, aby każdy mógł Ci pomóc. W przeciwnym razie zakładam dwie rzeczy:

  • Od czasu awarii twojego telefonu musisz robić coś niesamowitego, co pozwala programowi pracować poza przydzieloną przestrzenią pamięci maszyny wirtualnej.
  • Czy przechowujesz wszystkie kontakty na liście lub tablicy? Jeśli tak, to twój problem. To właśnie strumienie są dobre w naprawianiu.
  • 1

    Pobierania oznacza pobranie danych ze zdalnej lokalizacji? Wygląda na to, że przechowujesz wiele odniesień do swoich danych w pamięci. Czy musisz? W zależności od tego, co próbujesz osiągnąć, zazwyczaj istnieje kilka sposobów na zminimalizowanie śladu pamięci. Na początek upewniłem się, że nie używam żadnych odnośników do String, ale przesyłałem dane bezpośrednio do konsumenta. Spróbuj także przetworzyć wszystkie swoje dane w porcjach. Czy musisz również przechowywać dane w systemie plików? Jeśli tak, przesyłaj strumieniowo bezpośrednio do systemu plików i unikaj przechowywania wszystkich razem. Jeśli umieścisz jakiś kod, może to pomóc.