我尝试在JavaFX中使用webview来创建UI,但是有一个问题,当使用弹出窗口打开大图像时,内存使用量非常大,并且当弹出窗口关闭时,内存使用量不会下降,我通过Windows中的任务管理器看到了内存使用情况,
当使用webview打开大小约为8MB的图像时,内存在使用中达到了300MB,我不明白它为何如此之大,
我已经尝试了
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
webengine.load(null);
}
});
但仍然不要释放内存
答案 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。