Zaletą recyklingu ArrayList
(na przykład poprzez wywołanie clear
) jest to, że można uniknąć napowietrznej przydzielenie nowego, a koszt rośnie to ... jeśli nie zapewniają dobrą initialCapacity
podpowiedź.
Wady zawracanie do obiegu ArrayList
obejmują:
Sposób clear()
musi nadać null
do każdej (stosowane) szczeliny w ArrayList
s nośnej tablicy.
Numer clear()
nie zmienia rozmiaru tablicy, aby zwolnić pamięć. Więc jeśli wielokrotnie wypełniasz i czyścisz listę, to skończy się ona (na stałe) przy użyciu wystarczającej ilości pamięci, aby reprezentować największą listę, jaką napotka. Innymi słowy, zwiększyłeś ślad pamięci. Możesz to zwalczyć, wywołując trimToSize()
... który tworzy obiekt śmieci, etcetera.
Występują problemy lokalne i międzypokoleniowe, które mogą wpływać na wydajność. Gdy wielokrotnie odtwarzasz obiekt ArrayList
, obiekt i jego tablica podkładowa prawdopodobnie zostaną utrwalone.Oznacza to, że:
obiektów list i obiekty reprezentujące elementy listy mogą być w różnych obszarach stercie, potencjalnie zwiększając tęskni TLB i ruchu stron, zwłaszcza w czasie GC.
Przypisanie referencji (młodej generacji) do tablicy (na liście) (na liście) często wiąże się z kosztami napitku zapisu ... w zależności od implementacji GC.
Nie jest możliwe dokładne modelowanie wydajności kompromisów dla aplikacji rzeczywistych. Jest po prostu zbyt wiele zmiennych. Jednak "otrzymana mądrość" jest taka, że recykling NIE jest zwykle dobrym pomysłem, jeśli masz dużo pamięci i przyzwoitego śmieciarza.
Warto również zauważyć, że nowoczesna maszyna JVM może bardzo wydajnie rozmieszczać obiekty. Wystarczy jedynie zaktualizować "wolny" wskaźnik stosu i napisać 2 lub 3 słowa nagłówka obiektu. Wyzerowanie pamięci jest wykonywane przez GC ... a poza tym praca w ten sposób jest z grubsza równoważna z pracą, którą clear()
robi, aby usunąć odnośniki na liście, która jest poddawana recyklingowi.
1 - Kolektor do kopiowania jest bardziej wydajny, jeśli odsetek obiektów śmieciowych w obiektach innych niż śmieci jest wysoki. Jeśli przeanalizuje się sposób działania tego rodzaju kolektora, koszty są prawie wszystkie poniesione podczas wyszukiwania i kopiowania dostępnych obiektów. Jedyne, co należy zrobić, aby usunąć śmieci, to zablokować-zero-pisać ewakuowaną przestrzeń "z", gotową do przydzielenia nowych obiektów.
Moja rada byłaby nie do recyklingu ArrayList
obiektów, chyba że masz udowodnić potrzebę minimalizacji (śmieci) szybkość tworzenia obiektów; na przykład ponieważ jest to jedyna opcja do ograniczenia (szkodliwych) wstrzymań GC.
Wszystkie rzeczy są równe, na nowoczesnym Hotspot JVM mój zrozumienia jest to, że dostaniesz najlepszą wydajność, wykonując następujące czynności:
- Przydzielanie nowych obiektów ArrayList zamiast recyklingu.
- Używaj dokładnych
initialSize
wskazówek, kiedy przydzielasz obiekty listy. Lepiej jest nieco przeszacować niż nieznacznie zaniżać.
Nie ma pewności, kiedy obiekt będzie faktycznie zbiorem śmieci, więc myślę, że najlepiej byłoby opróżnić i użyć go ponownie. Nie jestem jednak mistrzem w używaniu pamięci, więc z chęcią zobaczę, jakie inne odpowiedzi uzyska ta odpowiedź. – Vulcan
'list.clear()' to zależy od kontekstu, czy masz jakieś inne odniesienia odnoszące się do tej samej listy? – nachokk
Brak innych referencji – Cricketer