2010-11-14 10 views
8

Sono curioso di scoprire come le ultime JVM gestiranno la memoria di raccolta dei rifiuti riservata con il seguente metodo.Il metodo ListlistList() impedisce la garbage collection del resto dell'elenco?

public List<Player> getHallOfFame() { 
    ArrayList<Player> listToSort = new ArrayList<Player>(map.values()); 
    Collections.sort(listToSort, comparator); 

    return listToSort.subList(0, 5); 
} 

Al peggiore che può immaginare la JVM mantenendo l'intero contenuto della listToSort in memoria fino a quando rimangono riferimenti alla sottolista. Qualcuno sa se questo è effettivamente il caso? Sono particolarmente interessato ai collegamenti che possono dimostrare questo in un modo o nell'altro per JVM specifici.

+0

Mi piacerebbe che .subList restituisca una nuova lista e listToSort andrà fuori campo, quindi otterrebbe la raccolta dei dati inutili. –

+3

@Paul: la documentazione indica diversamente. –

+0

Sì, la chiave qui è che è supportata dall'elenco originale in modo che qualsiasi modifica nell'elenco originale si rifletta nella sottolista. – CoolBeans

risposta

10

Sì, subList è solo una "vista" sull'elenco esistente. Tutti i dati sono davvero nella lista originale. Dalla documentazione:

L'elenco restituito è supportato da questo elenco, pertanto le modifiche non strutturali nell'elenco restituito si riflettono in questo elenco e viceversa.

Quindi sì, restituire un elenco secondario manterrà l'elenco originale da raccolta dei dati inutili.

Se non si desidera tale effetto, è necessario eseguire una copia della sottolista pertinente. Ad esempio:

return new ArrayList<Player>(listToSort.subList(0, 5)); 
+0

Grazie Jon. L'unica ragione per cui ho pensato che le cose potessero essere diverse è che l'analisi statica potrebbe dimostrare che l'elenco originale non può più essere modificato. – Caoilte

+3

@Caoilte: cose come la riflessione rendono questa analisi molto difficile. –

0

Penso che tu abbia ragione. Poiché la sottolista è supportata dall'elenco originale. Dalla documentazione java:

Restituisce una vista della porzione di questo lista tra il fromIndex specificato, inclusiva, e toIndex, esclusivo. (Se fromIndex e toIndex sono uguali, il elenco restituito è vuoto.) La restituito elenco è sostenuta da questa lista, così variazioni non strutturali del restituito lista si riflettono in questa lista, e viceversa. L'elenco restituito supporta tutte le operazioni di elenco opzionale supportate da questo elenco.

1

subList crea una nuova istanza di AbstractList.SubList, che mantiene un riferimento all'elenco originale. Quindi, se si mantiene la variabile restituita da getHallOfFame, si impedirà a gc di pulire listToSort.