He estado trabajando en una pérdida de cargador de clase en nuestra aplicación y finalmente llegué al punto donde todas las referencias a la CL se habían ido. En mi herramienta de perfilado de memoria (usando YourKit y jmap/jhat), puedo forzar un GC que a veces eliminará inmediatamente mi cargador de clases, pero luego otras veces (depende del uso de la aplicación pero eso es lo más específico que puedo) cuando fuerzo el GC, la instancia de CL no desaparece. Capturo una instantánea de memoria y miro los resultados y dice que este objeto existe, pero es inalcanzable.¿Por qué la JVM tarda tanto en GC mi objeto inalcanzable?
Aquí está la parte loca ... y solo descubrí esto por accidente.
Puedo forzar los GC completos todo lo que quiero, pero la instancia simplemente no desaparece. SIN EMBARGO, después de 10-20 minutos, si hago otro GC completo, se obtiene .
(Durante este período de tiempo la aplicación es en su mayoría inactivos (no totalmente). Mi café "extendida" fue el accidente que llevó a este descubrimiento.)
Así que mi preocupación por una fuga que aquí se ha ido (con suerte), pero la pregunta ahora es más tratar de explicar este comportamiento.
¿Alguien sabe qué podría hacer que la JVM del sol decida no recoger un cargador de clase inalcanzable durante 20 minutos?
Sun JVM detalles de la versión:
java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)
Esto podría ser útil: http://java.sun.com/developer/technicalArticles/javase/finalization/ – Jeremy
Otro dato más probablemente sea relevante: aquí estoy usando el colector paralelo. – Scott
Mi experiencia es bastante similar a la tuya y siempre podría explicarlo de la misma manera que un GC apropiado es algo complejo de lograr. Una interesante "discusión" al respecto va aquí: http://stackoverflow.com/questions/176745/circular-references-in-java. Hay algunos casos especiales manejados por un recolector de basura, uno de ellos son los cargadores de clase, y otros son referencias débiles. Si lo comprueba leyendo un código fuente de GC real o una respuesta _proven_, publíquelo aquí. Otro artículo sobre GC en Java5 en detalle: http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html –