La piedra

Esta semana pasada he estado revisando el rendimiento de ciertos procesos intensivos en CPU que tenemos en Nextail. La funcionalidad de profiling de Java Flight Recorder y Java Mission Control se han convertido en mi martillo en estos casos.

Cada vez que lo uso caigo en el mismo error, así que he decidido escribir un post para ver si no tropiezo con la misma piedra la próxima vez.

Leer más...
Cosas de Mapas

Al Construir la librería Bikey, para hacer que fuera lo más fácil y natural de usar para cualquier programador con experiencia en Java, intenté que el API siguiera los mismos patrones y semánticas que la librería de Collecciones de Java. Para eso estudié y repliqué el comportamiento (e incluso Javadoc) del API de Map.

Al hacerlo, me di cuenta de una cosa de la que no era consciente (o nunca me había planteado): los métodos Collection<V> values(), Set<K> keySet(), y Set<Map.Entry<K,​V>> entrySet() devuelven vistas del mapa:

Leer más...
Bikey

TL;DR: en este post os presento Bikey una librería de colecciones de Java para crear Maps y Sets cuyos elementos tienen dos claves, consumiendo desde un 70%-85% a un 99% menos de memoria que con estructuras de datos habituales. Es Open Source, publicada en https://github.com/jerolba/bikey y está disponible en Maven Central.

En dos de mis últimos artículos hablando sobre HashMaps planteaba los problemas que hay cuando gestionamos información referenciada con una clave formada por dos valores: Map<Pair<K1, K2>, V>. Si analizamos las opciones disponibles vemos que el consumo por unidad de información es relativamente elevada.

¿Por qué se consume tanta memoria si el 60% de la información está repetida?.

¿Hay alguna librería que implemente mapas y sets con clave compuesta de forma eficiente? Yo no la he encontrado.

Leer más...
Midiendo el uso real de memoria: JMnemohistosyne

TL;DR: en este post os presento JMnemohistosyne una pequeña utilidad para calcular el histograma de clases con la memoria consumida en una sección de código.

En mis dos últimos artículos tenía una especial preocupación por conocer cuál era el consumo de memoria de algunas estructuras de datos y cómo se distribuía el espacio ocupado entre las distintas clases que las forman.

En mi caso concreto, dado un fragmento de código necesitaba averiguar:

  • ¿Cuánta memoria han consumido los objetos que se han instanciado y quedan residentes en memoria?
  • ¿Cuántas instancias de cada clase existen?
  • ¿Cuánta memoria consumen?
Leer más...
Mapas con clave compuesta

En mi último post hablé de los problemas de usar una función hash incorrecta cuando guardas un objeto con clave compuesta en un HashMap de Java, pero me quedé con la duda: ¿qué estructura de datos es mejor a la hora de indexar esos objetos?

Siguiendo con el mismo ejemplo hablaré de productos y tiendas, y usaré sus identificadores para formar la clave del mapa. Las estructuras de datos propuestas son:

  • Un único mapa con una clave que contenga sus índices: HashMap<Tuple<Integer, Integer>, MyObject>, al que llamaré TupleMap.
  • Un mapa anidado: HashMap<Integer, HashMap<Integer, MyObject>>, al que llamaré DoubleMap.
Leer más...