【问题标题】:Exploding memory usage in Javafx WebView while loading many pages加载许多页面时 Javafx WebView 中的内存使用爆炸式增长
【发布时间】:2016-03-28 16:00:34
【问题描述】:

我在处理 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

【问题讨论】:

    标签: javafx webview out-of-memory


    【解决方案1】:

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


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

    只是在这两个页面之间交替会导致内存使用量不受控制地攀升。

    第1页:

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

    第 2 页:

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

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

    【讨论】:

    • @jewelsea 公平地说,OP 实际上并没有提出问题。他们表示“如果这是因为我的示例中的错误,我真的不放心”作为回应,我已经确认我们也看到了这个问题,即这不太可能是他们的错误。
    猜你喜欢
    • 1970-01-01
    • 2020-11-23
    • 2018-09-15
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2018-08-07
    相关资源
    最近更新 更多