Я использую jvisualvm
для проверки утечек памяти в моем приложении. Когда я делаю дамп кучи, иногда остаются открытыми несколько объектов, которые должны были быть собраны мусором.
Когда я выполняю на них команду «Показать ближайший GC Root», это показывает, что корень - это класс, который я определил и который реализует интерфейс Runnable. Ссылка указана как (java frame)
, что, как я знаю, связано с многопоточностью. Когда я раскрываю дерево для этого узла, он открывается и показывает <no references>
. Так что кажется довольно ясным, что это не ссылка, которую я держу открытой, а нечто внутреннее в Java.
Объект GC Root, указанный в jvisualvm, имеет тип AnalyticNode extends Node
, который, в свою очередь, равен Node implements Runnable
. Этот корневой объект никоим образом не имеет ничего общего с AWT, Swing или любыми тяжелыми компонентами пользовательского интерфейса, несмотря на используемое слово «рамка». В этом случае слово «рамка» относится к многопоточности.
Так Java хранит ссылку на последний Runnable где-нибудь, который будет держать это открытым? Есть ли какой-нибудь способ, которым я могу сказать Java освободить эту ссылку, чтобы она могла быть должным образом собрана мусором для моего дампа кучи?
Что здесь происходит?