2008-09-22 7 views
16

J'utilise jProfiler pour trouver des fuites de mémoire dans une application Java swing. J'ai identifié des instances d'un JFrame qui ne cesse de grossir.Qu'est-ce que 'référence JNI Global'

Cette image est ouverte puis fermée. En utilisant jProfiler et en affichant les chemins d'accès à la racine GC, il existe une seule référence, 'Référence globale JNI'.

Qu'est-ce que cela signifie? Pourquoi est-il suspendu à chaque instance du cadre?

Répondre

8

Wikipédia a un bon aperçu de Java Native Interface, essentiellement il permet la communication entre Java et les bibliothèques de système d'exploitation natives écrites dans d'autres langues.

Les références globales JNI sont sujettes aux fuites de mémoire, car elles ne sont pas collectées automatiquement et le programmeur doit les libérer explicitement. Si vous n'écrivez pas de code JNI vous-même, il est possible que la bibliothèque que vous utilisez ait une fuite de mémoire.

modifierhere est un peu plus d'informations sur les références mondiales locales par rapport, et pourquoi références globales sont utilisées (et comment ils doivent être libérés)

+2

Wikipedia est une source secondaire. La source principale et le document officiel sont les [Spécification JNI] (http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html). – EJP

12

Une référence mondiale JNI est une référence de code « natif » à un objet Java géré par le garbage collector Java. Son but est d'empêcher la collecte d'un objet qui est toujours utilisé par le code natif, mais ne semble pas avoir de références en direct dans le code Java. Un JFrame est un java.awt.Window et est associé à un objet Window "natif". Lorsque vous avez complètement terminé une instance JFrame particulière, vous devez appeler sa méthode dispose() pour effectuer le nettoyage.

Je ne suis pas sûr qu'un code natif crée une référence globale au JFrame, mais cela semble probable. Si c'est le cas, cela empêchera le JFrame d'être récupéré. Si vous créez de nombreux Windows (ou sous-classes) et que vous ne les collectez jamais, assurez-vous qu'ils sont éliminés.

+0

Si le code est seulement Java, c'est l'explication la plus probable. J'ai eu des problèmes avec les pointeurs globaux mais j'ai travaillé avec JNI. –

7

J'ai eu ce problème exact lors de la réparation des fuites de mémoire dans une application JavaFX. À la fin, le problème s'est avéré être que je courais l'application en mode de débogage et avait plusieurs points d'arrêt dans le code. Cela semble avoir fait que les objets soient 'référence globale JNI' et gardés en mémoire sans raison apparente. Quand j'ai désactivé le mode de débogage, tout a fonctionné comme il se doit!

+0

Merde, c'est exactement ce qui m'est arrivé! – Trejkaz

+0

Un de plus ici .. haha – BrunoJCM