Освобождение памяти при закрытии веб-браузера javafx

У меня проблема с простым приложением, использующим JavaFX, которое открывает веб-страницу при нажатии на элемент списка.

Это действительно простое приложение, которое, тем не менее, использует около 100 Мб памяти только для отображения списка задач. Когда я открываю одну из задач списка во встроенном браузере, предоставленном JavaFX, используемая память резко увеличивается до ~400 МБ, что огромно для такой простой программы.

Проблема возникает, когда я закрываю окно браузера, так как память не освобождается. Осталось около 350 мб.

Поскольку у нас есть проблемы с производительностью этого приложения, я пытаюсь найти способ уменьшить потребление памяти.

Вы знаете способ освободить память после закрытия окна браузера? Работает ли он так же, как и для вкладок (JavaFX сохраняет ссылку на последнюю закрытую вкладку, как описано здесь: Закрытие вкладок JavaFX не освобождает память от ArrayLists и TableViews на этой вкладке)?

Вот класс, который содержит браузер:

public class CustomBrowser extends Region {

    final WebView browser = new WebView();
    final WebEngine webEngine = browser.getEngine();

    private Application application;
    private int loaded;

    public CustomBrowser(final String url, int width, int height, boolean debug, final Application application) {

        this.application = application;

        if(application.config.isProxyWebview()){
            System.setProperty("http.proxyHost",application.config.getProxyHost());
            System.setProperty("http.proxyPort",String.valueOf(application.config.getProxyPort()));
        }
        Authenticator.setDefault(new CustomAuthenticator(application.config.getProxyUsername(),application.config.getProxyPassword()));

        init(url, width, height, debug, application, true);
    }

    public CustomBrowser() {
        super();
    }

    private void init(String url, int width, int height, boolean debug, final Application application, final boolean autoclose) {
        //apply the styles
        getStyleClass().add("browser");

        // process page loading
        browser.setPrefWidth(width);
        browser.setPrefHeight(height);

        webEngine.getLoadWorker().stateProperty().addListener(
                new ChangeListener<State>() {
                    @Override
                    public void changed(ObservableValue<? extends State> ov,
                                        State oldState, State newState) {
//                        System.out.println("onChange : oldState="+oldState+" - newState="+newState);

                        if (newState == State.SUCCEEDED) {
                            loaded++;
                            if(loaded==2 && autoclose){
                                application.refreshAll();
                                Stage stage = (Stage) getScene().getWindow();
                                stage.close();
                            }
//                            JSObject win = (JSObject) webEngine.executeScript("window");
//                            win.setMember("app", new JavaApp());
                        }
                    }
                }
        );

        // load the home page
        webEngine.load(url);

        //add components
        getChildren().add(browser);
        if(debug){
            TextField copyableUrl = new TextField(url);
            copyableUrl.setEditable(false);
            copyableUrl.getStyleClass().add("copyable-label");
            getChildren().add(copyableUrl);//new Label(url)
        }
    }

    public CustomBrowser(final String url, int width, int height, boolean debug, final Application application, final boolean autoclose) {
        init(url, width, height, debug, application, autoclose);
    }

    public String getUserAgent(){
        application.LOGGER.info("User Agent : {}", webEngine.getUserAgent());
        return webEngine.getUserAgent();
    }

    // JavaScript interface object
    public class JavaApp {

        public void exit() {
            Platform.exit();
        }
    }
}

0 ответов

Другие вопросы по тегам