2012-04-11 22 views
5

Creé una aplicación de muestra que provoca una pérdida de memoria.Fuga de memoria de JavaFX 2.0 al crear escenas múltiples

El problema es que necesito "volver a cargar" las escenas. Si tengo dos escenas (Bar y Foo) con un botón cada una (ButtonBar y ButtonFoo), los botones cambian la escena actual creando una nueva. Si permanezco haciendo clic en ButtonBar y ButtonFoo durante 5 minutos (o menos), el consumo de memoria de ese programa simple aumenta y aumenta.

Bar.java

public class Bar implements Initializable { 

@FXML 
private Label label; 

@FXML 
private void toFoo(ActionEvent event) { 
    try { 
     Button button = (Button) event.getSource(); 
     Parent root = FXMLLoader.load(getClass().getResource("Foo.fxml")); 
     Stage currentStage = (Stage) button.getScene().getWindow(); 
     currentStage.setScene(new Scene(root)); 
    } catch (IOException ex) { 
     Logger.getLogger(Bar.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    // TODO 
}  
} 

El Foo.java es el mismo cambio de fxml carga.

El fxml contiene sólo un botón:

<Button id="buttonBar" layoutX="126" layoutY="90" text="Bar!" onAction="#toFoo" fx:id="buttonBar" /> 

¿Hay un verdadero problema de fugas de memoria? ¿Alguien sabe otra forma de hacer esto? Quiero que esta aplicación se mantenga viva y haciendo cambios para siempre, como un servicio. Gracias

Respuesta

1

Tengo un problema similar.

Cuando muevo el mouse en la escena. El uso de la memoria aumenta y nunca hacia abajo.

Creo que esto está asociado con los eventos del mouse.

¡Buena suerte!

+1

Sip. Cualquier interacción con Scene Builder aumenta la memoria de forma exponencial ... esta es la última versión descargada del sitio de Java. WTF está pasando aquí? Esto es 2 años después de su publicación ... – crush

1

No estoy seguro acerca de las pérdidas de memoria, pero por razones de rendimiento evitaría la carga repetida del recurso.

Lo que hago es mantener esa raíz principal en una variable y agregarla a una escena, o en mi caso a una parte específica de otra escena según sea necesario, actualizando los valores mediante un método estático de la clase controladora.

que tienen varias de estas escenas precargados, que se actualizan una parte de una escena más grande cada vez que el usuario selecciona ciertos valores de una lista.

1

Le sugiero que pruebe FX8. Ya se han realizado una serie de correcciones para las pérdidas de memoria.

En caso de que no pueda actualizar a la última versión de JavaFX, le sugiero que no use onAction="#toFoo" en FXML.

Más bien, declare un controlador de eventos y llame a lo siguiente: buttonBar.addEventHandler(MouseEvent.MOUSE_CLICKED, declaredEventHandler);.

de lanzamiento a continuación, el controlador de eventos antes de salir de la pantalla actual: buttonBar.removeEventHandler(declaredEventHandler);