JavaFX isst mein Gedächtnis?

8

Bevor ich über den Titel frustriert bin, möchte ich klarstellen, dass ich auf JavaFX UI frischer bin. Ich bin seit 9 Jahren Entwickler mit Swing und habe mich entschieden, JavaFX zu testen. Beispiele im Internet zeigen, dass JavaFX wirklich schöne GUIs im Vergleich zu Swing erstellen kann. Vielleicht versuche ich GUIs auf die falsche Art zu erstellen und zu implementieren, aber eines ist sicher. JavaFX-Fenster laden langsamer als Swing und verbrauchen viel mehr Speicher. Die gleiche GUI wurde mit JAVAFX neu gestaltet und benötigt fast 200 MB, während die Swing GUI nur 50 MB benötigt.

Hier gebe ich ein Beispiel für den Code, wie ich die GUIs programmatisch mit Hilfe von FXML erzeuge.

%Vor%

Die Konstruktormethode von PanelCreator erstellt 3 FXMLPane-Klassen, eine Klasse, die sowohl das FXML-Fenster als auch den Controller kombiniert. Ein Code der FXMLPane-Klasse wird im folgenden Code angezeigt.

%Vor%

Mit PanelCreator kann ich jetzt die get-Methoden verwenden, um jedes JavaFX-Panel und seinen Controller zu bekommen, und ich muss nicht jedes Mal die FXML-Lade-Methode ausführen, um das Panel zu bekommen. Momentan stört mich nicht, dass die Erstellung von FXML-GUIs langsamer ist als Swing, sondern dass der RAM 3x und 4x mehr ist als die entsprechende Swing-Version.

Kann mir jemand erklären, was ich falsch mache? Die FXML-Dateien enthalten nur grundlegende Komponenten in einem Rasterbereich, Komponenten wie Schaltflächen, Ebenen und Textfelder.

Der Code für das obige Beispiel befindet sich hier

    
javasuns 04.03.2015, 19:09
quelle

1 Antwort

8

Zusammenfassung der Antworten aus dem Kommentarbereich:

  • JavaFX benötigt generell mehr Speicher. Z.B. JavaFX verwendet doppelte Genauigkeit für alle Eigenschaften entlang der UI-Komponenten, während Swing die meiste Zeit ganzzahlige Werte verwendet. Aber der Unterschied sollte nicht auffallen.
  • Java verbraucht mehr Speicher als erforderlich. Standardmäßig gibt Java den Speicher nicht zurück an Ihr System, selbst wenn Sie die Garbage Collection auslösen. Wenn also ein JavaFX-Programm während des Initialisierungsprozesses viel Speicher benötigt, es aber danach freigibt, behält die JRE für immer die maximale Speicherebene bei (siehe Abbildung 1). Als Nebeneffekt wird der GC weniger häufig ausgelöst, da so viel freier Speicherplatz frei ist (siehe Bild 2). Sie können den Standardwert ändern, indem Sie die JVM-Option -XX: + UseG1GC verwenden. Dies ändert das Verhalten, wie der Speicher zugewiesen wird, wie er freigegeben wird und wann der GC ausgelöst wird. Mit dieser Option sollte der zugewiesene Speicher besser in den verwendeten Speicher passen. Wenn Sie mehr tun wollen, sehen Sie Java Heap-Tuning
  • JavaFX ist ein neues Framework im Vergleich zu Swing. Es wird im Laufe der Zeit in Leistung und Ressourcenverbrauch verbessert werden. Wie Sie in Bild 1 und 3 sehen können, wurde es bereits verbessert. Es verwendet jetzt 8 bis 9 MB Speicher auf einem 64Bit Linux-Rechner. Dies ist noch weniger Speicher als die Swing-Version. Ich habe Oracle Java verwendet

    %Vor%

Abbildung 1: Speicherverbrauch über die Zeit für das JavaFX-Beispielprogramm. Es zeigt eine große Menge an freiem Speicher verglichen mit dem verwendeten Speicher. Der GC wurde mehrmals manuell ausgelöst, um den verwendeten Speicherbereich ohne Müll anzuzeigen.

Abbildung 2: Speicherverbrauch im Zeitverlauf für das JavaFX-Beispielprogramm, jedoch ohne den GC manuell auszulösen. Der verwendete Speicher wächst und wächst, weil der GC nicht ausgelöst wird.

Abbildung 3: Speicherverbrauch im Zeitverlauf für das JavaFX-Beispielprogramm mit der GC-Option -XX: + UseG1GC. Nach dem ersten GC-Zyklus wurde die Speichergröße auf die tatsächliche Größe des verwendeten Speichers reduziert.

    
Zerlono 27.11.2016 13:21
quelle