【问题标题】:How To Clear Javafx Webview Memory usage after closing stage关闭阶段后如何清除 Javafx Webview 内存使用情况
【发布时间】:2014-07-03 08:24:09
【问题描述】:

我尝试在JavaFX中使用webview来制作UI,但是有一个问题,当使用popup打开大图时,内存占用非常大,而当popup关闭时,内存使用并没有下降,我通过 Windows 中的任务管理器查看内存使用情况,

当使用webview打开8MB左右的图片时,内存在使用中达到了300MB,不明白为什么这么大,

我试过了

stage.setOnCloseRequest(new EventHandler<WindowEvent>() {

        @Override
        public void handle(WindowEvent event) { 
            webengine.load(null);   

        }
    });

但是,不要释放内存

【问题讨论】:

    标签: java webview javafx


    【解决方案1】:

    我在互联网上进行了广泛的搜索,找到了各种解决方案,不幸的是,没有一个对我有用。看起来,无论正在做什么,场景都是由 JFXPanel 进行的。对我有用的是以下内容;

    Scene scene = getScene();
    jfxPanel.removeAll();
    jfxPanel.setScene(scene);
    WebView webView = (WebView) scene.getRoot();
    webView.getWebEngine().load(url);
    

    getScene() 重新使用以前创建的场景(及其 Webview 和 WebEngine),在创建新场景时 JFXPanel 变得不可见。所以解决的办法就是移除并重新设置已有的Scene,然后加载url。

    【讨论】:

      【解决方案2】:

      我的代码(适用于我),灵感来自珠宝海的回答。

      // Delete cache for navigate back
      webEngine.load("about:blank");
      // Delete cookies 
      java.net.CookieHandler.setDefault(new java.net.CookieManager());
      

      【讨论】:

        【解决方案3】:

        您可能会看到RT-33729 WebView leaks WCImgDecoderImpl instances 的实例,目前针对Java 8u20 进行了修复。在 RT-33729 中,开发人员 (Leonid Popov) 写道:

        Webkit 具有用于网页的资源缓存,包括图像。 它继续保留未使用的(“死”)资源,即使它们不是 不再引用,以防用户按下“返回”以避免 加载已经加载的资源,而它们不会保留太多 堆空间。详见Webkit源码中的cmets:

        http://trac.webkit.org/browser/trunk/Source/WebCore/loader/cache/MemoryCache.h

        WCImgDecoderImpl 的实例通过 JNI 被引用 ImageSource 引用 BitmapImage 引用 CachedImage 引用 存储在 MemoryCache 中。我通过修改缓存对其进行了测试,以便它 彻底清空其缓存资源,并观察到所有 WCImgDecoderImpl 已经消失了。而 WCImgDecoderImpl 的一个实例 可以从 WebKit 原生代码访问,也不是没用。重点 是 WebKit 决定了 WCImgDecoderImpl 的生命周期吗 通过 JNI。调查如何强制刷新此缓存 关于移除 WebView,仍在进行中。

        从描述中谈论测试应用。当您删除一个 场景中的 WebView,它不会立即被删除(所以它 不释放任何资源)。相反,它注册了一个处置器 在处理线程(类似于 AWT 使用的线程)上,应该 在特定时间回调它并导致本机资源被 WebEngine 发布。

        另外,我建议在删除之前导航到“about:blank” 网络视图;它会立即释放一些资源。

        但是,也许您看到的完全是其他东西,我无法确切地告诉您,例如任何原因 RT-35262 JVM crash due to memory leak in WebView/Webkit,也将在 Java 8u20 或 RT-34630 WebView memory leak when JavaScript callbacks are assigned 中得到解决,在 Java 9 中得到解决。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-21
          • 1970-01-01
          • 1970-01-01
          • 2014-04-07
          • 2015-02-04
          • 1970-01-01
          • 2012-04-30
          相关资源
          最近更新 更多