Объекты узлов Javafx не собираются мусор
-
26-10-2019 - |
Вопрос
Javafx (1.2.x и 1.3.x), похоже, не допускает сборку мусора, по крайней мере, для узлов и сцен. Объект узла не освобождается после удаления с сцены (нет другой явной ссылки на него).
Вот пример:
var buttonB:Button =
Button {
text: "i'm just hanging here"
}
var buttonC:Button =
Button {
text: "hit me to leak memory"
action: function() {
buttonB.managed = false;
delete buttonB from mainBox.content;
buttonB.skin = null;
buttonB = null;
java.lang.System.gc();
}
}
def mainBox:HBox =
HBox {
hpos: HPos.CENTER
nodeVPos: VPos.CENTER
layoutInfo: LayoutInfo {
width: 800 height: 600
}
content: [buttonC, buttonB]
}
Баттонб никогда не освобождается. Установка кожи на нуль помогает (в VisualVM Большинство ссылок на кнопку исчезают), но не решает проблему. Я также попробовал аннулировать всех участников, используя Javafx Reflection, без повезло.
Можно ли сделать Buttonb, имеющим право на GC и как это сделать?
Проблема сохраняется в Javafx 2.0?
Решение
Я обнаружил (через визуальную проверку), что Javafx 1.3 сохраняет Softreferences к буферизованным изображениям (которые, вероятно, представляют собой визуализированные версии узлов) для удаленных узлов. Для меня это была своего рода утечка памяти, поскольку мягкие ссылки очищаются в зависимости от объема свободной памяти. Это не утечка памяти (из -за этого никогда не произойдет из -за того, что это не произойдет), но для меня это была причина, чтобы вызвать очень неэффективный сбор мусора.
Вы можете использовать XX:SoftRefLRUPolicyMSPerMB=<N>
Чтобы сократить время, сохраняются в сфере времени, это находится на возможном (но маловероятном) наказании на производительность. Он устанавливает количество миллисекунд на бесплатный MB, который сохраняется объект. По умолчанию 1000 мс.