Der Vorteil des Recyclings eine ArrayList
(zum Beispiel durch clear
Aufruf) ist, dass Sie den Aufwand für die Zuteilung eines neuen vermeiden und die Kosten für deren wachsenden ... wenn man keinen guten initialCapacity
Hinweis vorsah.
Die Nachteile eines ArrayList
Recycling gehören die folgenden:
clear()
Die Methode hat null
zu jedem (verwendeten) Schlitz in der ArrayList
s Trägerarray zuzuordnen.
Die Größe clear()
ändert nicht die Größe des Backing-Arrays, um Speicher freizugeben. Wenn Sie also eine Liste wiederholt ausfüllen und löschen, wird sie (permanent) mit genügend Speicher belegt, um die größte Liste darzustellen, auf die sie trifft. Mit anderen Worten, Sie haben den Speicherbedarf erhöht. Sie können das bekämpfen, indem Sie trimToSize()
aufrufen ... das ein Müllobjekt usw. erstellt.
Es gibt Lokalität und generationenübergreifende Probleme, die die Leistung beeinträchtigen könnten. Wenn Sie ein ArrayList
wiederholt wiederverwenden, wird das Objekt und sein unterstützendes Array wahrscheinlich fest sein.Das bedeutet, dass:
Die Liste Objekte und die Objekte, die Listenelemente sind wahrscheinlich in verschiedenen Bereichen des Haufens sein, möglicherweise zunehmenden TLB-Misses und Seite Verkehr, vor allem bei GC Zeit.
Zuordnung von (junge Generation) Referenzen in die Backing-Array (Tenure) Liste wahrscheinlich Schreibaufwand Overheads ... abhängig von der GC-Implementierung.
Es ist nicht möglich, genau die Leistungskompromisse für eine reale Anwendung zu modellieren. Es gibt einfach zu viele Variablen. Allerdings ist die "erhaltene Weisheit", dass das Recycling ist normalerweise keine gute Idee, wenn Sie viel Speicher haben und eine halbwegs anständige Garbage Collection.
Es ist auch erwähnenswert, dass eine moderne JVM Objekte sehr effizient zuweisen kann. Er muss lediglich auf den "freien" Zeiger des Heap aktualisieren und 2 oder 3 Objekt-Header-Wörter schreiben. Die Nullsetzung des Speichers erfolgt durch den GC ... und neben der Arbeit ist das grob entspricht der Arbeit, die clear()
tut, um Referenzen in der Liste, die recycelt wird, zu vernichten.
1 - Ein Kopiersammler ist effizienter, wenn der Anteil von Müllobjekten zu Nichtabfallobjekten hoch ist. Wenn Sie die Art und Weise analysieren, in der diese Art von Kollektor arbeitet, entstehen fast alle Kosten, um erreichbare Objekte zu finden und zu kopieren. Das einzige, was mit Müllobjekten getan werden muss, ist das Blockieren-Null-Schreiben des evakuierten "Von" -Raums, bereit für die Zuweisung neuer Objekte.
Mein Rat wäre, nicht ArrayList
Objekte zu recyceln, wenn Sie eine nachweisbare Notwendigkeit haben die (Müll) Objekterstellung Rate zu minimieren; z.B. weil es die einzige Option ist, die Sie haben, um (schädliche) GC-Pausen zu reduzieren.
Ceteris paribus, auf einem modernen Hotspot JVM mein Verständnis ist, dass Sie, indem Sie die folgende beste Leistung erhalten wird:
- Allokierung neue Arraylist Objekte statt Recycling.
- Verwenden Sie genaue
initialSize
Hinweise, wenn Sie die Listenobjekte zuweisen. Es ist besser, etwas zu überschätzen als zu unterschätzen.
Es gibt keine Sicherheit, wann das Objekt tatsächlich Müll gesammelt wird, also würde ich denken, dass es am besten wäre, es zu leeren und wiederzuverwenden. Ich bin jedoch kein Meister mit der Speichernutzung, also bin ich daran interessiert zu sehen, welche anderen Antworten diese Antwort bekommt. – Vulcan
'list.clear()' es hängt vom Kontext ab, haben Sie andere Referenzen, die sich auf dieselbe Liste beziehen? – nachokk
Keine anderen Referenzen – Cricketer