关闭javafx Web浏览器时释放内存

时间:2017-07-18 12:12:50

标签: java memory javafx-webengine

我在使用JavaFX的简单应用程序时遇到问题,该应用程序在单击列表元素时打开网页。

这是一个非常简单的应用程序,但它只使用大约100 Mb的内存来显示任务列表。 当我在JavaFX提供的嵌入式浏览器中打开列表中的一个任务时,使用的内存大幅增加到~400Mb,这对于这样简单的程序来说是巨大的。

当我关闭浏览器窗口而未释放内存时,会出现问题。它仍然在350 MB左右。

由于我们遇到了此应用程序的性能问题,我试图找到一种方法来减少内存消耗。

关闭浏览器窗口后,您知道一种释放内存的方法吗?它是否与制表符的工作方式相同(JavaFX保留了最后一个关闭制表符的引用,如下所述:Closing JavaFX tabs doesn't release memory from ArrayLists and TableViews in that tab)?

这是包含浏览器的类:

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 个答案:

没有答案