2017-10-11 12 views
0

Selon this et this, GlobalReferences aux objets dans JNI, gardez une référence de l'objet et tous les sous-champs accessibles. Et c'est une fuite de mémoire de ne pas le libérer rapidement.Est-ce que GlobalReferences dans JNI empêche GC de nettoyer l'objet?

Ce qui n'est pas clairement indiqué est si une référence globale empêche l'objet d'être GC'd, ou la fuite est dans la référence elle-même. En d'autres termes, j'essaie de comprendre si un GlobalReference empêche l'objet d'être GC'ed jamais, comme si j'avais une référence supplémentaire dans l'espace Java, ou si l'obejct pourrait être GC'd mais la fuite est dans l'objet de référence lui-même. J'ai tendance à croire est le premier, puisque la référence globale faible existe, ce qui selon les docs laissera l'objet original GC mourir - mais j'ai décidé de demander à être du bon côté.

+0

Avez-vous envisagé de consulter la spécification JNI? – EJP

+0

Ici http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#global_local n'indique pas clairement ce qui est réellement fait. – Panayotis

+0

Une référence globale n'est qu'une fuite si vous la perdez. –

Répondre

2

si un GlobalReference arrêtera l'objet à GC'ed

Oui, c'est le cas. Le GC est conscient des références mondiales de JNI et les considère comme des racines GC.

Les références globales JNI sont également exposées dans le JVMTI et vous pouvez les voir dans des outils tels que JProfiler.