Что такое «Глобальная ссылка JNI» - PullRequest
21 голосов
/ 22 сентября 2008

Я использую jProfiler для поиска утечек памяти в приложении Java Swing. Я определил случаи JFrame, число которых продолжает расти.

Этот кадр открывается, а затем закрывается.

Используя jProfiler и просматривая Paths to GC Root, есть только одна ссылка, «JNI Global reference».

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

Ответы [ 3 ]

13 голосов
/ 22 сентября 2008

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

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

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

12 голосов
/ 22 мая 2015

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

11 голосов
/ 22 сентября 2008

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

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

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

...