Question

JavaFX (1.2.x et 1.3.x) ne semble pas permettre la collecte des ordures au moins des noeuds et des scènes. Un objet nœud est pas libéré après avoir été retiré de la scène (il n'y a pas d'autre référence explicite à elle).

Voici va par exemple:

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]
   }

buttonB est jamais libéré. Réglage de la peau null aide en quelque sorte (en VisualVM la plupart des références au bouton disparaît), mais ne résout pas le problème. J'ai aussi essayé de détruire tous les membres utilisant la réflexion JavaFX sans chance.

Est-il possible de faire droit buttonB pour GC et comment le faire?

Le problème persiste dans JavaFX 2.0?

Était-ce utile?

La solution

J'ai trouvé (par l'inspection VisualVM) que JavaFX 1.3 conserve SoftReferences aux images mises en mémoire tampon (qui représentent probablement les versions rendus des nœuds) pour les noeuds qui ont été supprimés. Pour moi, ce fut une sorte de fuite de mémoire, comme références douces sont effacées en fonction de la quantité de mémoire libre. Ce n'est pas une fuite de mémoire (OutOfMemoryException ne se produira jamais à cause de cela), mais pour moi, ce fut la raison de causer la collecte des ordures très inefficace.

Vous pouvez utiliser XX:SoftRefLRUPolicyMSPerMB=<N> pour réduire le SoftReferences temps sont conservés, c'est à une possible (mais peu probable) pénalité de performance bien. Il définit le nombre de millisecondes par Mo libre qu'un objet est maintenu. Par défaut est de 1000 ms.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top