Il vantaggio di riciclare un ArrayList
(per esempio chiamando clear
) è che si evita il sovraccarico di allocare una nuova, e il costo di crescere ... se non hai fornito una buona initialCapacity
suggerimento.
Gli svantaggi di riciclaggio un ArrayList
sono i seguenti:
Procedimento clear()
deve assegnare a ciascun null
(usato) fessura nella ArrayList
s matrice di supporto.
Il clear()
non ridimensiona l'array di supporto per rilasciare memoria. Quindi, se si riempie e cancella ripetutamente un elenco, questo finirà (permanentemente) usando abbastanza memoria per rappresentare l'elenco più grande che incontra. In altre parole, hai aumentato l'ingombro della memoria. Puoi combatterlo chiamando lo trimToSize()
... che crea un oggetto spazzatura, eccetera.
Esistono problemi di località e intergenerazionali che possono influire sulle prestazioni. Quando si ricicla ripetutamente un ArrayList
, è probabile che l'oggetto e il relativo array di supporto vengano gestiti.Ciò significa che:
Gli oggetti di elenco e gli oggetti che rappresentano elementi della lista sono suscettibili di essere in diverse aree del mucchio, aumentando potenzialmente manca TLB e traffico pagina, in particolare in fase di GC.
L'assegnazione di riferimenti (di nuova generazione) nel backing array della lista (di proprietà dei supporti) è probabile che incorre in sovraccarichi di barriera di scrittura ... a seconda dell'implementazione del GC.
Non è possibile modellare accuratamente i compromessi di prestazioni per un'applicazione reale. Ci sono troppe variabili. Tuttavia, la "saggezza ricevuta" è che il riciclaggio NON è normalmente una buona idea se si ha un sacco di memoria e un raccoglitore di rifiuti decente.
Vale anche la pena notare che una JVM moderna può allocare oggetti in modo molto efficiente. Ha solo bisogno di aggiornare il puntatore "libero" dell'heap e scrivere 2 o 3 parole di intestazione dell'oggetto. L'azzeramento della memoria viene eseguito dal GC ... e inoltre il lavoro svolto è pari a equivalente al lavoro che clear()
esegue per annullare i riferimenti nell'elenco che viene riciclato.
1 - Un raccoglitore di copie è più efficiente se la percentuale di oggetti inutili su oggetti non obsoleti è elevata. Se analizzi il modo in cui funziona questo tipo di raccoglitore, i costi sono quasi tutti sostenuti per trovare e copiare oggetti raggiungibili. L'unica cosa che deve essere fatta per gli oggetti spazzatura è scrivere a zero zero lo spazio "da" evacuato per l'allocazione di nuovi oggetti.
Il mio consiglio sarebbe di non riciclare ArrayList
oggetti a meno che non si dispone di una necessità dimostrabile per ridurre al minimo il (spazzatura) tasso di creazione di oggetti; per esempio. perché è l'unica opzione disponibile per ridurre le pause GC (dannose).
A parità di condizioni, su una moderna Hotspot JVM la mia comprensione è che si ottengono migliori prestazioni nel modo seguente:
- L'assegnazione di nuovi oggetti ArrayList invece di riciclaggio.
- Utilizzare gli accurati spunti
initialSize
quando si assegnano gli oggetti elenco. È meglio sovrastimare leggermente di leggermente sottostimare.
fonte
2013-08-22 04:40:37
Non c'è alcuna garanzia di quando l'oggetto sarà effettivamente raccolto dai rifiuti, quindi penserei che lo svuotamento e il riutilizzo sarebbero i migliori. Non sono un maestro con l'uso della memoria, quindi sarei interessato a vedere quali altre risposte questa risposta ottiene. – Vulcan
'list.clear()' dipende dal contesto, hai altri riferimenti che si riferiscono alla stessa lista? – nachokk
Nessun altro riferimento – Cricketer