Estoy escribiendo un códec para procesar los mensajes enviados a través de TCP utilizando un protocolo de cable a medida. Durante el proceso de decodificación creo un número de String
s, BigDecimal
sy fechas. Los patrones de acceso de cliente-servidor significan que es común para el cliente para emitir una solicitud y luego decodificar miles de mensajes de respuesta, lo que resulta en un gran número de duplicarString
s, s, etc. BigDecimal
¿Usar el espacio PermGen o el método de prácticas internas de "rodar mi propio yo"?
Por lo tanto he creado una clase InternPool<T>
que me permite internar cada clase de objeto. Internamente, el grupo usa un WeakHashMap<T, WeakReference<T>>
. Por ejemplo:
InternPool<BigDecimal> pool = new InternPool<BigDecimal>();
...
// Read BigDecimal from in buffer and then intern.
BigDecimal quantity = pool.intern(readBigDecimal(in));
Mi pregunta: Estoy utilizando InternPool
para BigDecimal
pero debería también considerar el uso para String
en lugar deString
's intern()
método, que creo que utiliza el espacio PermGen? ¿Cuál es la ventaja de usar el espacio PermGen?
@kts: Si tuviera que mapear byte [] a BigDecimal, entonces el byte [] no será referenciado por nada una vez que el grupo interno haya creado/devuelto el BigDecimal. Suponiendo que el byte [] es la clave en el WeakHashMap subyacente, esto provocaría que la entrada se elimine a pesar de que se esté utilizando el BigDecimal correspondiente. – Adamski
¿Es 'WeakReference' apropiado para esto, o debería estar usando una' SoftReference'? El GC se comporta de manera diferente para ambos y parece que estás intentando crear un tipo de caché; las referencias débiles no son un buen uso para ese propósito. Vea mi respuesta aquí por algunas razones por las cuales: http://stackoverflow.com/questions/2861410/weakhashmap-iteration-and-garbage-collection/2862174#2862174 –
@ Adamski Yo usaría una SoftReference en el BigDecimal solamente y una ReferenceQueue para elimine 'byte []' s del mapa una vez que se haya puesto en cola un BigDecimal. (Probablemente necesite un BiMap).Esto puede eliminar la construcción de objetos redundantes BigDecimal que ahorran memoria/tiempo de ejecución de gc y tiempo de ejecución (solo tienen que crearse una vez). – KitsuneYMG