studio pasar objetos entre actividades java swing jprofiler

java - pasar - ¿Qué es ''referencia global de JNI''?



bundle android studio (3)

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

Un JFrame es una ventana java.awt.Window , y está asociado con un objeto Window "nativo". Cuando haya terminado por completo con una instancia de JFrame en particular, debe invocar su método dispose() para 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.

Estoy usando jProfiler para encontrar fugas de memoria en una aplicación Java swing. Identifiqué instancias de un JFrame que sigue creciendo en conteo.

Este marco se abre y luego se cierra.

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

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


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 de JNI son propensas a fugas de memoria, ya que no se recogen basura automáticamente, 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.

editar aquí es un poco más información sobre referencias locales vs. globales, y por qué se usan referencias globales (y cómo deberían liberarse)


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 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.