Ho un'app multithreading che scrive e legge un ConcurrentLinkedQueue, che è concettualmente utilizzato per eseguire il backing delle voci in un elenco/tabella. Originariamente ho usato una ConcurrentHashMap per questo, che ha funzionato bene. È arrivato un nuovo requisito necessario per tenere traccia delle voci degli ordini, in modo che potessero essere rimossi nel primo ordine meno recente, a seconda di alcune condizioni. ConcurrentLinkedQueue sembrava essere una buona scelta e funzionalmente funzionava bene.
Una quantità configurabile di voci viene mantenuta in memoria e quando viene offerta una nuova voce quando viene raggiunto il limite, la coda viene cercata nel primo ordine più vecchio per uno che può essere rimosso. Alcune voci non devono essere rimosse dal sistema e attendere l'interazione del client.
Quello che sembra accadere è che ho una voce nella parte anteriore della coda che si è verificata, ad esempio 100K voci fa. La coda sembra avere il numero limitato di voci configurate (size() == 100), ma durante la profilazione, ho trovato che c'erano ~ 100K oggetti ConcurrentLinkedQueue $ Node in memoria. Questo sembra essere di progettazione, basta dare un'occhiata all'origine per ConcurrentLinkedQueue, una rimozione rimuove semplicemente il riferimento all'oggetto che viene memorizzato, ma lascia l'elenco collegato in posizione per l'iterazione.
Infine la mia domanda: esiste un modo "migliore" pigro per gestire una raccolta di questa natura? Adoro la velocità di ConcurrentLinkedQueue, non posso permettermi la perdita illimitata che sembra essere possibile in questo caso. In caso contrario, sembra che dovrei creare una seconda struttura per tenere traccia dell'ordine e potrebbe avere gli stessi problemi, oltre a un problema di sincronizzazione.
Se non riesci a trovare la risposta qui, vai a http://altair.cs.oswego.edu/mai lman/listinfo/concurrency-interest e posta la tua domanda lì. Probabilmente l'autore di ConcurrentLinkedQueue ti darà una risposta decisiva. –