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

关闭javafx web浏览器时释放内存,java,memory,javafx-webengine,Java,Memory,Javafx Webengine,我对使用JavaFX的简单应用程序有一个问题,该应用程序在单击列表元素时会打开一个网页 这是一个非常简单的应用程序,但它仅使用大约100 Mb的内存来显示任务列表。 当我在JavaFX提供的嵌入式浏览器中打开列表中的一个任务时,使用的内存急剧增加到~400Mb,这对于这样简单的程序来说是巨大的 当我关闭浏览器窗口时出现问题,因为内存没有释放。它保持在350MB左右 由于这个应用程序存在性能问题,我正试图找到一种减少内存消耗的方法 您知道关闭浏览器窗口后释放内存的方法吗?它的工作方式是否与选项卡的

我对使用JavaFX的简单应用程序有一个问题,该应用程序在单击列表元素时会打开一个网页

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

当我关闭浏览器窗口时出现问题,因为内存没有释放。它保持在350MB左右

由于这个应用程序存在性能问题,我正试图找到一种减少内存消耗的方法

您知道关闭浏览器窗口后释放内存的方法吗?它的工作方式是否与选项卡的工作方式相同(JavaFX保留最后一个关闭的选项卡的引用,如下所述:)

下面是包含浏览器的类:

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();
        }
    }
}
公共类CustomBrowser扩展区域{
最终WebView浏览器=新WebView();
final-WebEngine-WebEngine=browser.getEngine();
私人申请;
私有int加载;
公共自定义浏览器(最终字符串url、整型宽度、整型高度、布尔调试、最终应用程序){
这个应用程序=应用程序;
if(application.config.isProxyWebview()){
setProperty(“http.proxyHost”,application.config.getProxyHost());
System.setProperty(“http.proxyPort”,String.valueOf(application.config.getProxyPort());
}
setDefault(新的CustomAuthenticator(application.config.getProxyUsername(),application.config.getProxyPassword());
init(url、宽度、高度、调试、应用程序、true);
}
公共自定义浏览器(){
超级();
}
私有void init(字符串url、整型宽度、整型高度、布尔调试、最终应用程序、最终布尔自动关闭){
//应用样式
getStyleClass().add(“浏览器”);
//处理页面加载
browser.setPrefWidth(宽度);
browser.setPrefHeight(高度);
webEngine.getLoadWorker().stateProperty().addListener(
新的ChangeListener(){
@凌驾

public void changed(observeValue)您是否也可以提供一些源代码?浏览器中显示了什么?显示另一个(即-空)页面是否有任何区别?您使用的是什么操作系统?在多台计算机和多个操作系统上是否会发生这种情况?关闭WebView时尝试加载空页面。有时会有所帮助。添加“webEngine.load(null)”“在关闭事件中,侦听器按照@G.Fiedler链接中所述工作。谢谢!