recorrer ordenado example entre diferencia definicion java collections hashmap hashtable real-time

ordenado - ¿Hay una implementación de HashMap en Java que no produce basura?



map string string java (4)

Las bibliotecas LibGdx tienen ArrayMap, que es una versión no-basura de hashmap.

http://libgdx.badlogicgames.com/

Tienen muchas otras colecciones sin basura. https://github.com/libgdx/libgdx/tree/master/gdx/src/com/badlogic/gdx/utils

Funcionan muy bien, con una pequeña limitación de no permitir la recursión anidada para el mismo iterador.

Me llamó la atención que java.util.HashMap produce basura para el GC cuando se usa en mi sistema de alto rendimiento, que básicamente es un selector que lee de la red. ¿Existe una alternativa a java.util.HashMap (es decir, no necesita implementar java.util.Map , en otras palabras, puede tener su propia API) que pueda usar y que no deje basura?

BASURA = objetos que salen del alcance y deberán ser recolectados por el GC.

Para @durron597:

public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); while(true) { map.put("foo1", "bah1"); map.put("foo2", "bah2"); map.remove("foo1"); Iterator<String> iter = map.keySet().iterator(); while(iter.hasNext()) { iter.next(); } } }

Ahora ejecuta eso con -verbose: gc y mira qué pasa ... :)


También hemos escrito una colección de estructuras de datos llamada CoralBits que proporciona alto rendimiento con cero creación de basura. Reutiliza iteradores y agrupa objetos de entrada de mapas. Para mapas que usan primitivos como claves, escribimos IntMap y LongMap . Para un mapa de propósito general, escribimos PooledHashMap que implementa java.util.Map para que pueda intercambiar su código por cero basura.

Trove y Javolution son otras alternativas, pero hemos descubierto que Javolution crea basura en algunas situaciones.

CoralBits también proporciona una clase de instrumentación MemorySampler que puede usar para averiguar dónde se está creando basura en su código. En el caso de java.util.HashMap el culpable es:

java.util.HashMap.createEntry(HashMap.java:901)

Puede echar un vistazo en este artículo escrito por mí que da un ejemplo de cómo usar MemorySampler para detectar basura en sus aplicaciones.

Descargo de responsabilidad: soy uno de los desarrolladores de CoralBits.


Sí. Eche un vistazo, por ejemplo, en las colecciones de Goldman Sachs .

Tienen una completa reimplementación del marco de recopilación del JDK (y mucho más) con énfasis en la huella de memoria baja. Por ejemplo, su HashMap no crea los objetos de Entry hasta que realmente lo necesiten. Mira la documentación aquí.

También hay Javolution , una biblioteca más pequeña con un propósito ligeramente diferente, principalmente para clases cercanas al tiempo real y predecibles en el tiempo, esto también implica poca basura.

Si desea almacenar elementos primitivos (lo que evita la creación de envoltorios), observe uno de estos:

  • Trove - las colecciones "estándar" para primitivos
  • Colecciones de Goldman Sachs, nuevamente
  • HPPC : acceso de menor nivel, a menudo ligeramente más rápido que Trove, pero te permite dispararte al pie con más facilidad
  • Koloboke : un tenedor de Trove hecho por personas de OpenHFT. Increíblemente rápido, evolucionando rápido. A partir de ahora (septiembre de 2014), solo se admiten mapas y conjuntos.