Tengo una aplicación multiproceso que escribe y lee un ConcurrentLinkedQueue, que se usa conceptualmente para respaldar entradas en una lista/tabla. Originalmente usé un ConcurrentHashMap para esto, que funcionó bien. Se requería un nuevo requisito para rastrear las entradas de la orden, por lo que se podían eliminar en la primera orden más antigua, dependiendo de algunas condiciones. ConcurrentLinkedQueue parecía ser una buena opción, y funcionalmente funciona bien.
Se almacena una cantidad configurable de entradas en la memoria, y cuando se ofrece una nueva entrada cuando se alcanza el límite, la cola se busca en la primera orden más antigua para una que se puede eliminar. Ciertas entradas no deben ser eliminadas por el sistema y esperar la interacción del cliente.
Lo que parece estar sucediendo es que tengo una entrada en la parte delantera de la cola, digamos 100K entradas. Parece que la cola tiene un número limitado de entradas configuradas (tamaño() == 100), pero cuando hice el perfil, encontré que había ~ 100K objetos ConcurrentLinkedQueue $ Node en la memoria. Esto parece ser por diseño, simplemente echando un vistazo a la fuente de ConcurrentLinkedQueue, una eliminación simplemente elimina la referencia al objeto que se está almacenando, pero deja la lista enlazada en su lugar para la iteración.
Finalmente mi pregunta: ¿Existe una forma "mejor" de holgazanería para manejar una colección de esta naturaleza? Me encanta la velocidad de ConcurrentLinkedQueue, simplemente no puedo permitirme la filtración ilimitada que parece ser posible en este caso. Si no, parece que tendría que crear una segunda estructura para seguir el orden y puede tener los mismos problemas, además de una preocupación de sincronización.
Si no puede encontrar la respuesta aquí, vaya a http://altair.cs.oswego.edu/mai lman/listinfo/concurrency-interest y publique su pregunta allí. Probablemente, el autor de ConcurrentLinkedQueue le dará una respuesta decisiva. –