2008-09-22 2 views
16

Я использую jProfiler для поиска утечек памяти в приложении Java swing. Я определил экземпляры JFrame, которые продолжают расти в расчете.Что такое 'JNI Global reference'

Эта рамка открыта, а затем закрыта.

Использование jProfiler и просмотр путей к GC Root существует только одна ссылка: «Глобальная ссылка JNI».

Что это значит? Почему он висит на каждом экземпляре кадра?

ответ

8

Википедия имеет хороший обзор Java Native Interface, по сути, он позволяет общаться между Java и родными операционными системами, написанными на других языках.

Глобальные ссылки JNI подвержены утечке памяти, так как они не автоматически собираются с мусором, и программист должен явно освободить их. Если вы не пишете какой-либо код JNI самостоятельно, возможно, что библиотека, которую вы используете, имеет утечку памяти.

редактироватьhere немного больше информации о местных против глобальных ссылок, и почему используются глобальные ссылки (и как они должны быть освобождены)

+2

Википедия является вторичным источником. Основным источником и официальным документом является [Спецификация JNI] (http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html). – EJP 2012-05-24 00:31:19

12

JNI глобальная ссылка является ссылкой из «родного» кода к объекту Java, управляемому сборщиком мусора Java. Его цель состоит в том, чтобы предотвратить сбор объекта, который все еще используется с помощью собственного кода, но, похоже, не содержит никаких живых ссылок в коде Java.

JFrame является java.awt.Window и связан с «родным» объектом Window. Когда вы полностью закончите с конкретным экземпляром JFrame, вы должны вызвать его метод dispose() для очистки.

Я не уверен, что какой-либо родной код создает глобальную ссылку на JFrame, но это кажется вероятным. Если это произойдет, это предотвратит сбор JFrame. Если вы создаете много Windows (или подклассов) и видите, что они никогда не собираются, убедитесь, что они удалены.

+0

Если код является только Java, это наиболее вероятное объяснение. У меня были проблемы с глобальными указателями, но я работал с JNI. – 2008-09-24 16:03:52

7

У меня была эта точная проблема при устранении утечек памяти в приложении JavaFX. В конце концов проблема оказалась в том, что я запускал приложение в режиме отладки и имел несколько контрольных точек в коде. Это, по-видимому, заставило объекты быть «JNI Global reference» и храниться в памяти без видимых причин. Когда я отключил режим отладки, все работало так, как должно!

+0

Дерьмо, это именно то, что произошло со мной! – Trejkaz 2017-12-11 05:25:01

Смежные вопросы