加载许多页面时,在Javafx WebView中爆炸内存使用情况

时间:2016-03-28 16:00:35

标签: javafx webview out-of-memory

我在使用Javafx中的WebView处理时遇到了问题。 我的任务管理器中的内存使用量超出了所有内容,并以崩溃结束。

我有一个简单的代码示例来重新创建问题:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class WebViewSample extends Application {

    public boolean cycle = false;

    public static void main(String[] args) { 
        launch(); 
    }

    @Override public void start(Stage primaryStage) {

        WebView webView = new WebView();
        WebEngine engine = webView.getEngine();

        engine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() { 
            @Override
            public void changed(ObservableValue<? extends Worker.State> obs, Worker.State old, Worker.State current) {

                if(javafx.concurrent.Worker.State.SUCCEEDED == current) {
                    if(cycle) {
                        engine.load("http://www.google.com");
                    } else {
                        engine.load("http://www.yahoo.com");
                    }
                    cycle = !cycle;
                }
            }
        });

        engine.load("http://www.google.com");
        primaryStage.setScene(new Scene(webView));
        primaryStage.show();
    }
}

基本上,代码只是交替加载两个网站!我的问题不仅仅是这两个页面,在我的主程序中加载所有不同的URL。但这也重现了问题。

我到目前为止尝试过:

  • 调用System.gc()
  • 构建URLStreamHandlerFactory以防止图像加载
  • 调用engine.getHistory()。setMaxSize(0)
  • 我使用visualvm监控过程 - 并发现内存使用不会爆炸
  • engine.load(“about:blank”)在加载页面之间
  • 谷歌搜索3天,任何解决方案

如果这是因为我的例子中的错误,我错过了某些东西或自然的事情,我真的不感到害羞......

我很高兴得到任何帮助,谢谢!

  • Java 1.8.0_77

1 个答案:

答案 0 :(得分:0)

2016年7月22日编辑: 显然,这已在JDK 9中修复:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8159594

我们也看到过使用JDK 1.8.0_92的类似行为。

只是在这两页之间交替导致内存使用无法控制地攀升。

第1页:

UU

第2页:

<head></head>
<body>
  <h1>Page 1</h1>
  <script>
    window.location.href = "page2.html";
  </script>
</body>

我们目前无法找到这种明显内存泄漏的任何解决方案。