2011-11-18 11 views
9

Mam dziwne wątpliwości. Wiem, że odśmiecacz ma własne ograniczenia. a jeśli przydzielanie jest nieprawidłowe, może to spowodować problem w odpowiedzi na wniosek w nietypowy sposób.Zbiór śmieci w systemie Android (wykonane ręcznie)

Więc moje pytanie brzmi, czy to dobry nawyk wywoływania silnie śmieciowego kolekcjonera (System.gc()) na końcu każdego działania?

Aktualizacja

Każdy mówi, że dzwoni System.gc() nie korzystny w all.Then zastanawiam się, dlaczego jego obecny here.DVM zadecyduje, kiedy uruchomić śmieci collector.Then jaka jest potrzeba ta metoda?

Aktualizacja 2

Thanks społeczności mi pomóc. Ale szczerze mam wiedzę na temat zbierania śmieci prawdziwy Beauvoir z tego linku Java Performance Optimization

+0

Nie sądzę, że jeśli twoja aplikacja nie ma wydajności, powinna być czymś innym, chyba że przydzielisz ogromną ilość danych. Czy tak jest? – lc2817

+1

Potrzeba metody system.gc() http://stackoverflow.com/questions/3117429/garbage-collector-in-android –

+0

@ Ic2817 uważnie przeczytaj pytanie. Nie powiedziałem, że moja aplikacja zachowuje się w ten sposób. Omawiam istniejącą system.gc() – Sameer

Odpowiedz

9

to nie dobry zwyczaj programowania zadzwonić siłą śmieciarza (System.gc()) na końcu każdej aktywności

Ponieważ jest to bezużyteczne, tylko DVM decyduje o tym, kiedy należy zadzwonić, chociaż go nazwiesz ...

+0

Dziękuję wszystkim za szybką reakcję. Jeśli zadzwoniłem po każdym działaniu, to jak to zadziała. – Sameer

+0

to ci pomoże http://chaoticjava.com/posts/how-does-garbage-collection-work/ –

+0

yes thanx..a to komu, kto chciał przeczytać odczyt śmieci w java.Ale chcę wiedzieć dlaczego system.gc() istnieje tutaj, jeśli wszystko decyduje przez DVM – Sameer

1

Nie; jeśli system potrzebuje pamięci, wywoła GC samodzielnie.

Każda pamięć używana przez instancję, która nie jest nigdzie indziej wymieniona, zostanie zakwalifikowana do GC, gdy instancja zniknie.

Pamięć używana przez samą instancję, jeśli nie jest już przywoływana, jest również uprawniona do GC. Możesz może zrobić recenzję kodu lub profilowania, aby zobaczyć, czy nie zatrzymujesz się w pamięci niepotrzebnie, ale to inny problem.

+0

, a następnie dlaczego system.gc() przedstawia? – Sameer

+0

@ Sameer Zapytaj oryginalnych inżynierów Java. Zakładam, że możesz podać wskazówki dla systemu, ale jego zachowanie zależy od implementacji. Wiesz, że pytałeś o to rok temu, prawda? –

+0

tak, zadałem to pytanie rok temu ... Ale nadal nie jestem pewien co do korzystania z System.gc(). Zakładam więc, że jest to wskazówka dla JVM do uruchomienia garbage collectora (jak już powiedziałeś), ale nie możesz wymusić na JVM – Sameer

2

dzwonienie pod numer System.gc(), nie wyrządza żadnej szkody. ale nie możesz być pewien, że będzie to miało jakiś pożytek. ponieważ ty poprosić DVM o wyrzucenie śmieci, ale nie może polecenie it ... To zależy całkowicie od DVM. domaga się, gdy pamięć jest na wyczerpaniu lub może być w każdej chwili ..

1

Istnieje sesja poświęcona zarządzaniu pamięcią, zaprezentowana na Google IO 2011 przez Patricka Dubroya. Warto to obejrzeć, ponieważ omawiał on alokację sterty i pracę GC na tym planie. Możesz go obejrzeć tutaj Memory Management

1

Próbowałem umieścić System.gc() na linii przed liniami, w których utworzyłem swoją bitmapę w mojej aplikacji na Androida. Śmieciarz zwolnił kilka megabajtów w niektórych przypadkach i umieścić i zakończyć moje warunki OutOfMemoryError. Nie zakłócało to normalnego zbierania śmieci, ale sprawiło, że moja aplikacja działa szybciej.

+0

Ok..i ma pewne pojęcie o istnieniu system.gc(), ale niech będzie otwarta na przyszłą najlepszą odpowiedź. Wtedy przyjmuję jeden z nich jako odpowiedź. Ale poproś o twój wysiłek – Sameer

4

System.gc(), która czasami ignoruje VM na kaprys, to przede wszystkim przydatne w dwóch przypadkach:

  1. jesteś wydziobujących pamięć jakby jutra miało nie być (zazwyczaj z bitmap).
  2. podejrzewasz przeciek pamięci (taki jak przypadkowe przytrzymanie starego kontekstu) i chcesz umieścić pamięć maszyny wirtualnej w stanie spoczynku, aby sprawdzić, czy wykorzystanie pamięci się zwiększa, do debugowania.

W warunkach nominalnych nie należy z niego korzystać.

2

Naprawdę myślę, że to zależy od twojej sytuacji.

Ponieważ sterty są generacyjne, GC może nie pozbyć się niektórych dużych obiektów lub bitmap na pierwszym przejściu, a jego heurystyka może nie wskazywać, że dodatkowe usuwanie śmieci jest konieczne, ale istnieją zdecydowanie scenariusze, w których heurystyka może być Źle, a my jako programiści znamy wzorzec, lub możemy przewidzieć użycie, którego nie ma GC, a zatem wywołanie system.gc() przyniesie nam korzyść.

Widziałem to wcześniej w określonych sytuacjach, takich jak układanie kafelków map lub inne intensywne graficzne zachowania, w których natywny GC w systemie Android (nawet na urządzeniach z systemem 3.0+) nie zapewnia prawidłowego działania, co skutkuje brakiem pamięci błędy. Jednak dodanie kilku wywołań GC powoduje, że błędy braku pamięci są blokowane, a system nadal przetwarza dane z mniejszą szybkością (z powodu czyszczenia pamięci). W intensywnych operacjach graficznych zazwyczaj oznacza to, że pożądany stan (niewielkie opóźnienie) w aplikacji ulega awarii, ponieważ nie może załadować dodatkowych zasobów do pamięci.

Moje jedyne wyjaśnienie, dlaczego tak się dzieje w niektórych sytuacjach, wydaje się być czasowe. Jeśli operacje użytkownika są powolne, natywna wersja GC systemu Android wydaje się być świetna. Jeśli jednak użytkownik szybko przewija lub szybko się powiększa, widziałem, że opóźnienie GC Androida jest opóźnione, a kilka dobrze przemyślanych SystemGc() spowodowało awarię moich aplikacji.

0

Wywołanie GC ręcznie jest zły nawyk kodowania ...

The Developer docs on RAM usage Stan:

...
GC_EXPLICIT

Wyraźne GC, jak podczas rozmowy gc() (który powinieneś uniknąć dzwoniąc pod numer d zamiast tego zaufaj GC, aby działała w razie potrzeby).

...

mam podświetlone najważniejszą i odpowiednią część tutaj pogrubioną czcionką.