JavaFX frisst mein Speicher?

Bevor wir frustriert über den Titel, ich möchte klar heraus, dass ich bin ein frischer auf JavaFX-UI. Ich habe einen Entwickler, der für 9 Jahre, mit Swing und zurzeit habe ich beschlossen, einen Versuch zu JavaFX. Beispiele auf dem Netz zeigt, dass JavaFX wirklich können schöne GUIs im Vergleich zu Swing. Vielleicht bin ich versucht zu erstellen und implementieren Sie GUIs der falsche Weg, aber eine Sache ist sicher. JavaFX-Scheiben laden langsamer als Swing und verbraucht viel mehr Speicher. Der gleichen Benutzeroberfläche wurde neu gestaltet mit JAVAFX und es dauert fast 200Mb während der Swing-GUI nehmen nur 50Mb.

Hier gebe ich ein Beispiel code, wie kann ich das erstellen des GUIs mit FXML.

public class PanelCreator {

   private FXMLPane<LoginPaneController>           loginFXML;
   private FXMLPane<RegistrationPaneController>    registerFXML;
   private FXMLPane<EmailValidationPaneController> emailValidationFXML;

   public PanelCreator() {
      this.rootPane = rootPane;
      try {
        loginFXML           = new FXMLPane<LoginPaneController>("Login.fxml");
        registerFXML        = new FXMLPane<RegistrationPaneController>("Register.fxml");
        emailValidationFXML = new FXMLPane<EmailValidationPaneController>("EmailValidation.fxml");
      } catch (IOException e) {e.printStackTrace();} //catch
   } //Constructor Method

   public Pane getLoginPane() {
      return loginFXML.getPane();
   } //getLoginPane()

   public Pane getRegisterPane() {
      return registerFXML.getPane();
   } //getRegisterPane

   public Pane getEmailValidationPane() {
      return emailValidationFXML.getPane();
   } //getEmailValidationPane

   public LoginPaneController getLoginPaneController() {
      return loginFXML.getController();
   } //getLoginPaneController()

   public RegistrationPaneController getRegistrationPaneController() {
      return registerFXML.getController();
   } //getRegistrationPaneController()
} //class PanelCreator

Die Konstruktor-Methode von PanelCreator erstellt 3 FXMLPane Klassen, eine Klasse, die kombiniert sowohl die FXML-Bereich und dessen Steuerung. Ein code of FXMLPane Klasse angezeigt wird, den folgenden code.

public class FXMLPane<T> {

    private Pane pane;
    private T paneController;

    public FXMLPane(String url) throws IOException {
        URL location = getClass().getResource(url);
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(location);
        fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
        pane = fxmlLoader.load(location.openStream());
        paneController = fxmlLoader.<T>getController();
    } //Constructor Method

    public Pane getPane() {
        return pane;
    } //getPane()

    public T getController() {
        return paneController;
    } //getController()
}

Durch PanelCreator jetzt kann ich mit der get-Methoden, um jedes JavaFX-Panel und seine regler und ich weiß nicht ausführen müssen, das FXML load-Methode jedes mal, wenn man das panel. Derzeit, was mich stört ist nicht, dass die Schaffung von FXML GUIs ist langsamer als Swing aber mehr, dass das RAM ist 3x und 4x mal mehr als die correspoing Swing-version.

Kann mir jemand erklären was ich falsch mache? Der FXML-Dateien nur grundlegende Komponenten auf einem Raster-Komponenten wie Schaltflächen, Ebenen und Feldern.

JavaFX frisst mein Speicher?

Den code für das obige Beispiel kann gefunden werden hier

  • Haben Sie überprüft, dass der Haufen tatsächlich verbraucht? Java verbrauchen nativen Speicher, wenn es zu benötigen, da irgendwann aber kehrt niemals zurück, dass das OS (da ist es besser, aus einer performance-Sicht). So haben Sie versucht zu drucken, wie viel heap ist Links?
  • Wie sind Sie mit der Messung der Speicher Verbrauch? Können Sie eine einfache Beispielanwendung, für jemand anderen zu Profilieren? Laufen Sie Ihren vergleichbar Swing-und JavaFX-Anwendungen auf genau die gleiche hardware, die gleiche Java-runtime-version und mit der gleichen Befehlszeile-Schalter?
  • Wirklich zu verstehen, den Speicherverbrauch, der das Verhalten einer Anwendung kann eine heikle und schwierige Sache. Aus dem code und Informationen, die Sie zur Verfügung gestellt haben bisher, ist es nicht möglich für jemand anderen zu verstehen und zu diagnostizieren, den Speicherverbrauch der Anwendung noch konkret zu bestimmen, was Sie tun, falsch ist.
  • Ich aktualisiert habe diesen thread mit screenshot und die Ressource für den Download der code, den ich entwickelt habe.
  • Ja, ich sehe, was du meinst. Mit Java 8u40 auf meinem PC, die Swing-version benötigt etwa 30 MB und FX verfügt über 70MB. Es scheint dann, dass der FX ist ein schwerer toolkit. Vor zehn Jahren hätte das besorgt mich auch, aber heute mit noch Handys mit GB RAM sollte es kein Problem sein, denke ich? Beachten Sie auch, dass die FX hat die Eigenschaften/Fähigkeiten, die Swing nicht haben die es schwerer.
  • Ich kann ja mit Ihnen überein, dass JavaFX enthält mehr Funktionen und ist daher schwerer, aber ich habe nicht einer von denen. Ich bin nur die Erstellung von einfachen Scheiben hier. Vorstellen, dass die vollständige Anwendung laden, mehr Scheiben, und sogar sub-Scheiben mit den Ergebnissen, die in die Haupt-Schmerzen; etwas, das führt zu großen Speicherverbrauch. Es scheint, dass für jeden Bereich erstellt, um 30mb verbraucht werden, die nicht zumutbar ist.
  • In meinem app-Ihr arbeitet zu etwa 12 MB pro Bereich, inklusive Daten. Ich bin der Entwicklung eines Patienten-management-system .... Ich öffnete die 5 Patienten mit je 10 tabs mit komplexen sub-Bereiche (Textfeldern, Textbereichen, Listen, Tabellen, Bäume, web-Ansicht, usw). Der Rahmen ist etwa 5 Scheiben und das alles hat bis auf etwa 650MB.
  • Das ist viel zu viel:) es wird die Hälfte des verfügbaren Speichers auf einem regulären Handy. Können Sie einen schnellen test, indem Sie eine ähnliche Benutzeroberfläche mit Java(nicht JavaFX), um einen Vergleich zu machen?
  • Nein, entwickelte ich dieses von Grund auf neu - es gibt keine früheren Swing-version. Auch seine desktop-app, entwickelt für das Handy anders sein würde. Zum Beispiel die 5 Patienten wurden alle zur gleichen Zeit geöffnet! Wenn ich darf nur ein zu einer Zeit, dann würde ich nur brauchen, sagen 200MB ständig.
  • Auch firefox ist, dass die meisten schweren-app, die bisher nicht so viel Speicher. Irgendwas läuft wirklich falsch hier
  • Ich bin damit einverstanden, dass es wäre wirklich schön, wenn FX Speicherverbrauch verringert werden könnte 🙂
  • irgendwelche Vorschläge?
  • irgendwelche Vorschläge?
  • Mit dem raw-Prozess Speichernutzung Berichte aus dem Windows Activity Monitor ist nicht ein guter Weg, um zu Messen der Speicherauslastung Effizienz einer Anwendung. Zum Beispiel, wenn die Maschine nicht verwendeten Speicher, manchmal ist es effizienter, wenn ein Prozess zu schnappen Sie sich einige, dass der Speicher, selbst wenn Sie es nicht brauchen, weil der Prozess könnte in der Lage sein, um eine bessere Ausführung mit der extra Speicher jetzt oder in der Zukunft (z.B. weniger Prügel von der garbage-collector in einer JVM.
  • Ich lief Ihr apps einschränken, die maximale heap-Speicher-Größe auf eine minimale Größe, die es erlaubt, die Anwendung zu starten - auf OS X Java 8u40, für die Swing-Programm, das war 4Mb java -Xmx4m für die JavaFX-Programm, dieses wurde 8Mb java -Xmx8m. So wird sowohl das Swing-und JavaFX-Programme sind in der Lage, den Betrieb mit einem relativ kleinen java-heap-space-Nutzung.
  • Wenn Sie Ihre Anwendungen ausführen, die mit Standard-java-Befehlszeile-Einstellungen durch ein tool wie VisualVM und das tool verwenden, um trigger eine garbage collection, Sie werden feststellen, dass beide Programme nur ein paar Megabyte heap-Speicher und die Mehrheit der heap-Speichers der Java-Prozess wird nicht verwendet.
  • so gibt es eine Möglichkeit grundsätzlich vermieden werden, der zusätzliche Speicherverbrauch und die Anwendung ausgeführt wird, nur mit den tatsächlichen minimal-Speicher benötigt?
  • Sie können die maximale heap-Größe, die explizit auf der Befehlszeile, wie gezeigt, in einem meiner vorherigen Kommentare. Vorsichtig sein dabei, weil es begrenzt den Speicher für die Anwendung zur Verfügung. Wenn Sie das limit zu niedrig ist, Ihre Anwendung ausgeführt wird, aus dem Gedächtnis, es könnte auch nicht so gut, wie es laufen muss, garbage collection häufiger. Sie können google-Themen auf Java-memory-Verbrauch um weitere Informationen zu finden.

InformationsquelleAutor javasuns | 2015-03-04
Schreibe einen Kommentar