Question

J'utilise jProfiler pour rechercher des fuites de mémoire dans une application Java Swing. J'ai identifié des exemples d'un JFrame dont le nombre ne cesse de croître.

Ce cadre est ouvert, puis fermé.

L’utilisation de jProfiler et l’affichage de la section Chemins vers la racine du CPG ne comportent qu’une seule référence, "Référence globale JNI".

Qu'est-ce que cela signifie? Pourquoi s’accroche-t-il à chaque instance du cadre?

Était-ce utile?

La solution

Wikipedia a un bon aperçu de la interface native Java , elle permet essentiellement la communication entre Java et les applications natives. bibliothèques du système d'exploitation écrites dans d'autres langues.

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

modifier here contient un peu plus d’informations sur les références locales par rapport aux références globales et explique pourquoi les références globales sont utilisées (et comment elles doivent être libérées)

Autres conseils

Une référence globale JNI est une référence de "native". code à un objet Java géré par le ramasse-miettes Java. Son but est d'empêcher la collecte d'un objet qui est toujours utilisé par du code natif, mais ne semble pas avoir de référence active dans le code Java.

Un JFrame est un java.awt.Window , et est associé à un "natif". Objet Window. Lorsque vous avez terminé avec une instance JFrame particulière, vous devez appeler sa méthode dispose () pour la nettoyer.

Je ne sais pas si un code natif est en train de créer une référence globale à JFrame, mais cela semble probable. Si tel est le cas, cela empêchera que JFrame soit collecté. Si vous créez plusieurs Windows (ou sous-classes) et constatez qu’ils ne sont jamais collectés, assurez-vous qu’ils sont supprimés.

J'ai eu ce problème précis lors de la résolution de fuites de mémoire dans une application JavaFX. Finalement, le problème s’est avéré que j’exécutais l’application en mode débogage et que le code comportait plusieurs points de rupture. Cela semble avoir fait en sorte que les objets constituent la "référence globale JNI" et soient conservés en mémoire sans raison apparente. Quand j’ai désactivé le mode débogage, tout a fonctionné comme il se doit!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top