2008-09-22 33 views
16

Estoy usando jProfiler para encontrar fugas de memoria en una aplicación Java swing. Identifiqué instancias de un JFrame que sigue creciendo en conteo.¿Qué es 'Referencia global JNI'

Este marco se abre y luego se cierra.

Utilizando jProfiler, y viendo las Rutas a la raíz de la GC, solo hay una referencia, 'Referencia global JNI'.

¿Qué significa esto? ¿Por qué está pendiente de cada instancia del marco?

Respuesta

8

Wikipedia tiene una buena visión general de Java Native Interface, esencialmente permite la comunicación entre Java y las bibliotecas nativas del sistema operativo escritas en otros idiomas.

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

ediciónhere es un poco más de información sobre las referencias globales locales frente, y por qué se utilizan las referencias globales (y cómo deben ser liberados)

+2

Wikipedia es una fuente secundaria. La fuente primaria y el documento oficial es la [Especificación JNI] (http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html). – EJP

12

Un JNI global de referencia es una referencia de 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 por código nativo, pero no parece tener referencias en vivo en el código de Java.

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

No estoy seguro de si algún código nativo está creando una referencia global al JFrame, pero parece probable. Si lo hace, esto evitará que el JFrame sea recolectado como basura. Si está creando muchos Windows (o subclases) y observa que nunca se recopilan, asegúrese de que estén eliminados.

+0

Si el código es solo Java, esta es la explicación más probable. He tenido problemas con punteros globales, pero he estado trabajando con JNI. –

7

Tuve este problema exacto al corregir fugas de memoria en una aplicación JavaFX. Al final, el problema resultó ser que estaba ejecutando la aplicación en el modo de depuración y tenía varios puntos de interrupción en el código. Esto parece haber causado que los objetos sean "referencias globales de JNI" y se mantengan en la memoria sin motivo aparente. Cuando apagué el modo de depuración todo funcionó como debería.

+0

¡Mierda, esto es exactamente lo que me acaba de pasar! – Trejkaz

+0

Una más aquí ... jaja – BrunoJCM

Cuestiones relacionadas