2011-12-02 27 views
51

Ejecuté un volcado de pila en mi programa. Cuando lo abrí en la herramienta del analizador de memoria, encontré que el java.lang.ref.Finalizer para org.logicalcobwebs.proxool.ProxyStatement ocupaba mucha memoria. ¿Por qué esto es tan?es una pérdida de memoria? Por qué java.lang.ref.Finalizer consume tanta memoria

screenshot

+0

El enlace de "imágenes" va a lo que parece ser su perfil de Twitter. –

+0

@ R.MartinhoFernandes Se trata de una imagen que ha alojado en twitter, creo. – Oliver

Respuesta

49

Algunas clases implementan el método Object.finalize(). Los objetos que anulan este método deben ser llamados por un finalizador de llamadas de fondo y no pueden limpiarse hasta que esto ocurra. Si estas tareas son cortas y no descarta muchas de ellas, todo funciona bien. Sin embargo, si está creando muchos de estos objetos y/o sus finalizadores toman mucho tiempo, se acumula la cola de objetos para finalizar. Es posible que esta cola use toda la memoria.

La solución es

  • no utilice finalize (d) los objetos si se puede (si está escribiendo la clase para el objeto)
  • hacer ultimar muy corto (si tiene que usarlo)
  • no descartan tales objetos cada vez que (tratar de volver a usarlos)

La última opción es probable que sea mejor para usted que está utilizando una biblioteca existente.

+12

Opción n.º 4: evite el uso de bibliotecas que (sobre) usan finalizadores. –

+3

Una variación de la opción n. ° 1;) –

+0

tal vez el problema sea la causa del hilo del Finalizador. una clase anula el método finalizado, causa que el Finalizer enrute el bloqueo muerto – fuyou001

7

Por lo que puedo entender, Proxool es un grupo de conexiones para conexiones JDBC. Esto me sugiere que el problema es que su aplicación está haciendo un uso indebido del grupo de conexiones. En lugar de llamar al close en los objetos de declaración, es probable que su código los elimine y/o sus conexiones principales. Proxool confía en los finalizadores para cerrar los objetos subyacentes implementados por el controlador ... pero esto requiere esas instancias de Finalizer. También podría significar que está causando la conexión para abrir/cerrar conexiones de bases de datos (reales) con más frecuencia de la necesaria, y eso sería perjudicial para el rendimiento.

Por lo tanto, le sugiero que compruebe el código de los objetos filtrados ResultSet, Statement y/o Connection, y asegúrese de cerrarlos en los bloques finally.


En cuanto al volcado de memoria, espero que le preocupe dónde van los 898.527.228 bytes. La gran mayoría son retenidos por el objeto Finalizer cuyo id es 2aab07855e38. Si todavía tiene el archivo de volcado, eche un vistazo a qué se refiere al que hace referenciaFinalizer. Parece más problemático que los objetos de Proxool.

+0

gracias, pero no puedo encontrar la causa de la encuesta de conexión JDBC memoy leak – fuyou001

+0

Bueno, tampoco puedo a menos que vea su código fuente. (Y no estoy preparado para pasar mi tiempo investigando de todos modos ...) –

Cuestiones relacionadas