Вопрос

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 мс.

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