如何在结束阶段后清除Javafx Webview内存使用情况

时间:2014-05-15 03:45:44

标签: java webview javafx

我尝试在JavaFX中使用webview来创建UI,但是有一个问题,当使用弹出窗口打开大图像时,内存使用量非常大,并且当弹出窗口关闭时,内存使用量不会下降,我通过Windows中的任务管理器看到了内存使用情况,

当使用webview打开大小约为8MB的图像时,内存在使用中达到了300MB,我不明白它为何如此之大,

我已经尝试了

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

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

        }
    });

但仍然不要释放内存

3 个答案:

答案 0 :(得分:7)

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

  

Webkit具有用于网页的资源缓存,包括图像。   它继续保持未使用(“死”)资源,即使它们没有   仅在用户按下“后退”以避免的情况下再引用   加载已经加载的资源,虽然它们没有保留太多   堆空间。请参阅Webkit源代码中的注释中的详细信息:

     

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

     

WCImgDecoderImpl的实例通过JNI引用   ImageSource由CachedImage引用的BitmapImage引用   存储在MemoryCache中。我通过修改缓存来测试它   彻底扫除了它的缓存资源,并观察了所有   WCImgDecoderImpl已经消失了。而WCImgDecoderImpl的一个实例   可以从WebKit本机代码访问,它不是没用的。关键点   就是WebKit管理WCImgDecoderImpl的生命周期   通过JNI。调查如何强制刷新此缓存   关于WebView的删除,仍在继续。

     

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

     

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

但是,也许你完全看到了别的东西,我无法明确地告诉你,例如导致{8}或RT-35262 JVM crash due to memory leak in WebView/Webkit因为解决了Java 8u20或RT-34630 WebView memory leak when JavaScript callbacks are assigned而导致解决的问题for Java 9。

答案 1 :(得分:1)

我的代码(适合我),灵感来自jewelsea的回答。

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

答案 2 :(得分:0)

我已经广泛搜索了互联网并找到了所有类型的解决方案,不幸的是,这些解决方案都没有形成我。看起来,无论做什么,场景都由JFXPanel追逐。对我有用的是以下内容;

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

getScene()重新使用以前创建的Scene(带有Webview和WebEngine),在创建新场景时,JFXPanel不可见。因此,解决方案在于删除并重新设置现有场景,然后加载URL。

相关问题