UWP App WebView泄漏内存,无法清除图像

时间:2019-12-10 12:10:25

标签: webview uwp uwp-xaml

问题:

WebView加载图像后不释放内存。

如果所有WebView实例都被销毁了几秒钟,则内存似乎确实被释放了。我们从XAML树中删除了所有代码中的引用。 (我们在调试器中检查了所有实例均已释放。)

此解决方案存在问题,因为Web视图必须停滞一会儿才能清除内存,这对于我们的用例来说是不可接受的。

如何复制:

制作UWP C#应用程序或C ++ UWP应用程序->添加WebView->加载带有随机URL的大图像->内存不断增长。

我们只有一个活动的WebView,并且一次又一次地在其中加载大图像。 (我们将部分图片网址随机化,以模拟不同的广告加载。)

内存不断增长,就像从未释放过图像一样。 我们尝试了什么:

  • 使用WebView.ClearTemporaryWebDataAsync()清除缓存,但不会执行任何操作。
  • 手动触发GC。

注释:

  • 我们使用“ WebView(WebViewExecutionMode.SeparateThread)”初始化Webview。 (其他执行模式似乎无济于事)。
  • 我们不使用WebViewBrush。

1 个答案:

答案 0 :(得分:1)

  

UWP App WebView泄漏内存,无法清除图像

WebView是复杂元素。它具有自己的垃圾收集规则,为了保持渲染性能,它将缓存大量数据,这些数据会导致内存持续增长并且gc进程很慢。我们不能两全其美。

根据我的经验,您可以将WebView来源重复设置为“ about:blank”,这样可以立即释放大多数数据。

private void AppBarButton_Click(object sender, RoutedEventArgs e)
{
    int count = 0;
    var timer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(1) };
    timer.Start();
    timer.Tick += (s, p) =>
    {
        TestWebView.Source = new Uri("about:blank");
        count++;
        if (count == 20)
        {
            timer.Stop();
        }
    };      
}