Что такое глобальная ссылка JNI?
Я использую jProfiler для поиска утечек памяти в приложении Java swing. Я обнаружил экземпляры JFrame, которые постоянно растут.
Этот кадр открывается, а затем закрывается.
С помощью jProfiler и просмотра путей к GC Root существует только одна ссылка: "Глобальная ссылка JNI".
Что это значит? Почему он висит на каждом экземпляре кадра?
Ответы
Ответ 1
В Википедии есть хороший обзор Java Native Interface, по сути, он позволяет общаться между Java и встроенными библиотеками операционной системы на других языках.
Глобальные ссылки JNI подвержены утечкам памяти, так как они не автоматически собираются с мусором, и программист должен явно освобождать их. Если вы не пишете какой-либо код JNI самостоятельно, возможно, что используемая библиотека имеет утечку памяти.
изменить здесь - это немного больше информации о локальных и глобальных ссылках и почему используются глобальные ссылки ( и как они должны быть освобождены)
Ответ 2
Глобальная ссылка JNI является ссылкой из "родного" кода на объект Java, управляемый сборщиком мусора Java. Его цель - предотвратить сбор объекта, который все еще используется с помощью собственного кода, но, похоже, не содержит никаких живых ссылок в коде Java.
JFrame является java.awt.Window
и связан с "родным" объектом Window. Когда вы полностью закончите с конкретным экземпляром JFrame, вы должны вызвать его метод dispose()
для очистки.
Я не уверен, что какой-либо собственный код создает глобальную ссылку на JFrame, но это кажется вероятным. Если это произойдет, это предотвратит сбор JFrame. Если вы создаете много Windows (или подклассов) и видите, что они никогда не собираются, убедитесь, что они расположены.
Ответ 3
У меня была эта точная проблема при исправлении утечек памяти в приложении JavaFX. В итоге проблема оказалась в том, что я запускал приложение в режиме отладки и имел несколько контрольных точек в коде. Это, по-видимому, заставило объекты быть "JNI Global reference" и храниться в памяти без видимых причин. Когда я отключил режим отладки, все работало так, как должно!