Pregunta

Estoy usando jProfiler para encontrar pérdidas de memoria en una aplicación Java swing.He identificado casos de un JFrame cuyo número sigue aumentando.

Este marco se abre y luego se cierra.

Al usar jProfiler y ver las rutas a GC Root, solo hay una referencia, 'Referencia global de JNI'.

¿Qué quiere decir esto?¿Por qué se aferra a cada instancia del marco?

¿Fue útil?

Solución

Wikipedia tiene una buena descripción general de Interfaz nativa de Java, esencialmente permite la comunicación entre Java y las bibliotecas del sistema operativo nativo escritas en otros lenguajes.

Las referencias globales de JNI son propensas a sufrir pérdidas de memoria, ya que no se recolectan automáticamente como basura y el programador debe liberarlas explícitamente.Si no está escribiendo ningún código JNI usted mismo, es posible que la biblioteca que está utilizando tenga una pérdida de memoria.

editar aquí Hay un poco más de información sobre local vs.referencias globales y por qué se utilizan referencias globales (y cómo deberían liberarse)

Otros consejos

Una referencia global JNI es una referencia del código "nativo" a un objeto Java administrado por el recolector de basura de Java.Su propósito es evitar la recopilación de un objeto que todavía está en uso mediante código nativo, pero que no parece tener ninguna referencia activa en el código Java.

Un JFrame es un java.awt.Window, y está asociado con un objeto Ventana "nativo".Cuando haya terminado por completo con una instancia de JFrame en particular, debe invocar su dispose() Método para limpiar.

No estoy seguro de si algún código nativo está creando una referencia global al JFrame, pero parece probable.Si es así, esto evitará que el JFrame sea recolectado como basura.Si está creando muchas ventanas (o subclases) y ve que nunca se recopilan, asegúrese de eliminarlas.

Tuve exactamente este problema al solucionar pérdidas de memoria en una aplicación JavaFX.Al final, el problema resultó ser que estaba ejecutando la aplicación en modo de depuración y tenía varios puntos de interrupción en el código.Esto parece haber provocado que los objetos sean 'referencia JNI Global' y se mantengan en la memoria sin motivo aparente.Cuando desactivé el modo de depuración, ¡todo funcionó como debería!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top