Что такое глобальная ссылка 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" и храниться в памяти без видимых причин. Когда я отключил режим отладки, все работало так, как должно!