Como mencionó Stephen C, la pérdida de memoria se debe a los cargadores de clases. Pero el problema es más agudo que a primera vista. Considere esto:
mapkey --> class --> classloader --> all other classes defined by this classloader.
Además,
class --> any static members, including static Maps e.g. caches.
Unos dichas cachés estáticas pueden empezar a añadir hasta cantidades graves de la memoria pierde cada vez que una aplicación web o alguna otra forma dinámica (classloaded) aplicación de carga se realiza un ciclo.
Existen varias formas de solucionar este problema. Si no le importan las diferentes "versiones" de la misma clase de diferentes cargadores de clases, simplemente la clave se basa en Class.getName()
, que es java.lang.String
.
Otra opción es usar java.util.WeakHashMap
. Esta forma de mapa solo mantiene referencias débiles a las claves. Las referencias débiles no retienen GC, por lo que la clave no causará acumulación de memoria. Sin embargo, los valores son no a los que se hace referencia débilmente. Por lo tanto, si los valores son, por ejemplo, instancias de las clases utilizadas como claves, el WeakHashMap
no funciona.
No estoy seguro de que pueda causar pérdidas de memoria ... solo significa que el mapa hace referencia a la versión estática de String (utilizada por sus métodos estáticos). – Powerlord
Los problemas de pérdida de memoria son (por ejemplo) cuando se cuelga una referencia a un objeto o clase de un mapa de mayor duración. Por ejemplo, si en una aplicación web registra un controlador JDBC de su guerra (DriverManager.ergisterDriver), la clase DriverManager, cargada por el cargador de clases bootstrap (no el cargador de clases webapp) mantiene una referencia a su clase de controlador. Por lo tanto, cuando descarga la aplicación web, no puede descargar el cargador de clases de aplicaciones web (debido a la clase de controlador enganchado) y ninguna de las otras clases de aplicaciones web está descargada. Y eso no es bueno – helios
Me gustaría saber dónde oíste este concepto de fuga? ¿Puedes recordar algún detalle sobre dónde oíste esto? ¿Fue posiblemente en el contexto de un entorno con múltiples clasificadores (por ejemplo, contenedor de aplicaciones web)? –