我尝试在JavaFX中使用webview制作UI,但是有一个问题,当使用popup打开大图像时,内存使用量非常大,并且当popup关闭时,内存使用量不会下降,我明白了通过 Windows 中的任务管理器查看内存使用情况,
当使用webview打开大小约为8MB的图像时,内存使用达到300MB,我不明白为什么这么大,
我试过了
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
webengine.load(null);
}
});
但仍然不要释放内存
您可能正在看到一个实例RT-33729 WebView 泄漏 WCImgDecoderImpl 实例 https://javafx-jira.kenai.com/browse/RT-33729,目前目标是针对 Java 8u20 进行修复。在 RT-33729 中,开发人员 (Leonid Popov) 写道:
Webkit 具有用于网页的资源缓存,包括图像。
即使资源不再使用,它也会继续保留未使用的(“死的”)资源。
不再引用,以防用户按“后退”以避免
加载已经加载的资源,但它们不会保留太多
堆空间。详情参见Webkit源码中的注释:
http://trac.webkit.org/browser/trunk/Source/WebCore/loader/cache/MemoryCache.h 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 由于 WebView/Webkit 中的内存泄漏而导致 JVM 崩溃 https://javafx-jira.kenai.com/browse/RT-35262,也将针对 Java 8u20 进行解决或RT-34630 分配 JavaScript 回调时 WebView 内存泄漏 https://javafx-jira.kenai.com/browse/RT-34630,由于 Java 9 已解决。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)