Что такое «Глобальная ссылка JNI»
Вопрос
Я использую jProfiler для поиска утечек памяти в приложении Java Swing.Я обнаружил экземпляры JFrame, число которых продолжает расти.
Этот кадр открывается, а затем закрывается.
Используя jProfiler и просматривая пути к корню GC, есть только одна ссылка: «Глобальная ссылка JNI».
Что это значит?Почему он цепляется за каждый экземпляр кадра?
Решение
В Википедии есть хороший обзор Собственный интерфейс Java, по сути, он обеспечивает связь между Java и собственными библиотеками операционной системы, написанными на других языках.
Глобальные ссылки JNI склонны к утечкам памяти, поскольку они не удаляются автоматически сборщиком мусора, и программист должен явно освободить их.Если вы не пишете код JNI самостоятельно, возможно, в используемой вами библиотеке есть утечка памяти.
редактировать здесь немного больше информации о местных vs.глобальные ссылки и почему используются глобальные ссылки (и как их следует освобождать)
Другие советы
Глобальная ссылка JNI — это ссылка из «собственного» кода на объект Java, управляемый сборщиком мусора Java.Его цель — предотвратить сбор объекта, который все еще используется собственным кодом, но не имеет никаких активных ссылок в коде Java.
JFrame — это java.awt.Window
, и связан с «собственным» объектом Window.Когда вы полностью закончите работу с конкретным экземпляром JFrame, вам следует вызвать его dispose()
метод очистки.
Я не уверен, создает ли какой-либо собственный код глобальную ссылку на JFrame, но это кажется вероятным.Если это так, это предотвратит сбор мусора JFrame.Если вы создаете множество окон (или подклассов) и видите, что они никогда не собираются, убедитесь, что они удалены.
У меня возникла именно такая проблема при устранении утечек памяти в приложении JavaFX.В конце концов проблема оказалась в том, что я запускал приложение в Режим отладки и имел несколько точек останова в коде.Похоже, это привело к тому, что объекты стали «глобальными ссылками JNI» и сохранялись в памяти без видимой причины.Когда я отключил режим отладки, все заработало как надо!