Como siempre, una larga descripción del problema.Muy extraño OutOfMemoryError
Actualmente estamos poniendo a prueba nuestro producto, y ahora nos enfrentamos a un problema extraño. Después de una o dos horas, el espacio del montón comienza a crecer, la aplicación muere algún tiempo después.
El perfil de la aplicación muestra una gran cantidad de objetos Finalizer, llenando el montón. Bien, pensamos que el problema "podría ser el hilo finalizador extraño para ralentizar" y se revisó para reducir la cantidad de objetos que se deben finalizar (los manejadores nativos de JNA en este caso). Buena idea de todos modos y reducido miles de objetos nuevos ...
Las siguientes pruebas mostraron el mismo patrón, solo una hora más tarde y no tan pronunciadas. Esta vez, los Finalizer se originaron a partir de las secuencias FileInput y FileOutput que se usan mucho en el banco de pruebas. Todos los recursos están cerrados, pero los Finalizers ya no se limpiaron.
No tengo idea de por qué después de 1 o 2 horas (sin excepciones) el FinalizerThread parece dejar de funcionar repentinamente. Si forzamos System.runFinalization() a mano en algunos de nuestros hilos, el generador de perfiles muestra que los finalizadores se limpian. Reanudar la prueba de inmediato causa una nueva asignación de montón para los Finalizadores.
El FinalizerThread todavía está allí, preguntando a jConsole que está ESPERANDO.
EDITAR
En primer lugar, la inspección de la pila con HeapAnalyzer reveló nada nuevo/extraño. HeapAnalyzer tiene algunas características agradables, pero tuve mis dificultades al principio. Estoy usando jProfiler, que viene con buenas herramientas de inspección de montón y se quedará con eso.
¿Tal vez me faltan algunas funciones fatales en HeapAnalyzer?
En segundo lugar, hoy configuramos las pruebas con una conexión de depuración en lugar del perfilador: el sistema es estable durante casi 5 horas. Esta parece ser una combinación muy extraña de demasiados Finalizer (que se han reducido en la primera revisión), el generador de perfiles y las estrategias de VM GC. Como todo funciona bien en este momento, no hay ideas reales ...
Gracias por la contribución hasta ahora, tal vez permanezca atento e interesado (ahora que puede tener más razones para creer que no hablamos de una simple programación culpa).
Puede que quiera dar http://java.sun.com/developer/technicalArticles/javase/finalization/ a read. – Charles
Algunas ideas: http://stackoverflow.com/questions/8355064/is-memory-leak-why-java-lang-ref-finalizer-eat-so-much-memory – assylias
Finalizers realmente no son confiables. Evítales. –