Объекты JavaFX Node не являются сборщиком мусора - PullRequest
2 голосов
/ 18 октября 2011

JavaFX (1.2.x и 1.3.x), по-видимому, не позволяет собирать мусор как минимум для узлов и сцен. Объект Node не освобождается после удаления из Scene (другой явной ссылки на него нет).

Вот пример:

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]
   }
Кнопка

никогда не освобождается. Установка скина в null помогает как-то (в VisualVM большинство ссылок на кнопку исчезает), но не устраняет проблему. Я также безуспешно пытался обнулить все члены, используя отражение JavaFX.

Можно ли сделать ButtonB подходящей для GC и как это сделать?

Проблема сохраняется в JavaFX 2.0?

1 Ответ

7 голосов
/ 16 ноября 2011

Я обнаружил (посредством проверки VisualVM), что JavaFX 1.3 сохраняет SoftReferences для буферизованных изображений (которые, вероятно, представляют собой визуализированные версии узлов) для удаленных узлов. Для меня это была своего рода утечка памяти, поскольку мягкие ссылки очищаются в зависимости от количества свободной памяти. Это не утечка памяти (OutOfMemoryException никогда не произойдет из-за этого), но для меня это стало причиной очень неэффективного сбора мусора.

Вы можете использовать XX:SoftRefLRUPolicyMSPerMB=<N>, чтобы сократить время хранения SoftReferences, однако это с возможным (но маловероятным) снижением производительности. Он устанавливает количество миллисекунд на один свободный MB, которое хранится у объекта. По умолчанию 1000 мс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...