Mengapa JavaFX Memakan Banyak Memory?

Sebelum frustrasi dengan judulnya, saya ingin menjelaskan bahwa saya baru di JavaFX UI. Saya telah menjadi pengembang selama 9 tahun, menggunakan Swing dan saat ini saya memutuskan untuk mencoba JavaFX. Contoh di internet menunjukkan bahwa JavaFX benar-benar dapat membuat GUI yang indah dibandingkan dengan Swing.

Mungkin saya mencoba membuat dan menyebarkan GUI dengan cara yang salah, tetapi satu hal yang pasti. Panel JavaFX memuat lebih lambat dari Swing dan menghabiskan lebih banyak memori. GUI yang sama didesain ulang dengan JAVAFX dan dibutuhkan hampir 200Mb sedangkan GUI Swing hanya membutuhkan 50Mb.

Berikut saya berikan contoh kode cara membuat GUI secara terprogram menggunakan FXML.

 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

Metode konstruktor PanelCreator membuat 3 kelas FXMLPane, kelas yang menggabungkan Panel FXML dan Pengontrolnya. Kode kelas FXMLPane ditampilkan pada kode berikut.

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()
}

Melalui PanelCreator sekarang saya dapat menggunakan metode get untuk mendapatkan setiap Panel JavaFX dan pengontrolnya dan saya tidak harus menjalankan metode pemuatan FXML setiap kali untuk mendapatkan panel. Saat ini, yang mengganggu saya bukanlah pembuatan GUI FXML lebih lambat dari Swing tetapi lebih karena RAM 3x dan 4x kali lebih banyak daripada versi Swing yang sesuai.

Dapatkah seseorang menjelaskan kepada saya apa yang saya lakukan salah? File FXML hanya memiliki komponen dasar pada Panel Kotak, komponen seperti tombol, lapisan, dan bidang teks.

Berikut ini Alasan JavaFX memakan banyak memory

  1. JavaFX membutuhkan lebih banyak memori secara umum. Misalnya. JavaFX menggunakan presisi ganda untuk semua properti di sepanjang komponen UI, sementara Swing sering menggunakan nilai integer. Tetapi perbedaannya seharusnya tidak terlihat.
  2. Java mengkonsumsi lebih banyak memori sesuai kebutuhan. Sebagai default Java tidak mengembalikan memori kembali ke sistem Anda bahkan jika Anda memicu pengumpulan sampah. Jadi jika program JavaFX membutuhkan banyak memori pada proses inisialisasi tetapi membebaskannya setelah itu, JRE terus mempertahankan tingkat memori maksimum untuk selamanya (lihat gambar 1). Sebagai efek samping, GC akan lebih jarang terpicu, karena ada begitu banyak memori kosong yang tidak terpakai (lihat gambar 2). Anda dapat mengubah default dengan menggunakan opsi JVM -XX:+UseG1GC. Ini mengubah perilaku bagaimana memori dialokasikan, bagaimana itu dibebaskan dan kapan GC dipicu. Dengan opsi ini, memori yang dialokasikan harus lebih sesuai dengan memori yang digunakan. Jika Anda ingin lebih banyak penyetelan, lihat Java Heap Tuning
  3. JavaFX adalah kerangka kerja baru dibandingkan dengan Swing. Ini akan ditingkatkan dari waktu ke waktu dalam kinerja dan konsumsi sumber daya. Seperti yang Anda lihat pada gambar 1 dan 3 sudah diperbaiki. Sekarang menggunakan memori 8 hingga 9MB pada mesin Linux 64Bit. Ini bahkan lebih sedikit memori daripada versi Swing. Saya menggunakan Oracle Java.
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

Konsumsi memori dari waktu ke waktu untuk program contoh JavaFX. Ini menunjukkan sejumlah besar memori bebas dibandingkan dengan memori yang digunakan. GC dipicu secara manual beberapa kali untuk menampilkan bagian memori yang digunakan tanpa sampah.

Konsumsi memori dari waktu ke waktu untuk program contoh JavaFX, tetapi tanpa memicu GC secara manual. Memori yang digunakan bertambah dan bertambah karena GC tidak dipicu.

Konsumsi memori dari waktu ke waktu untuk program contoh JavaFX menggunakan opsi GC -XX:+UseG1GC. Setelah siklus GC pertama, ukuran memori dikurangi agar sesuai dengan ukuran sebenarnya dari memori yang digunakan.

Tampaknya FX adalah perangkat yang lebih berat. Sepuluh tahun yang lalu itu akan membuat saya khawatir juga, tetapi hari ini bahkan dengan ponsel yang memiliki RAM GB, itu seharusnya tidak menjadi masalah, saya pikir? Pertimbangkan juga bahwa FX memiliki fitur/kemampuan yang tidak dimiliki Swing yang akan membuatnya lebih berat.

Leave a Reply

Your email address will not be published. Required fields are marked *