Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top