【问题标题】:UWP App WebView Leaks Memory, doesn't clear imagesUWP App WebView Leaks Memory,不清除图像
【发布时间】:2020-04-03 14:55:25
【问题描述】:

问题:

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

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

此解决方案存在问题,因为 Web 视图必须停止一段时间才能启动内存清除,并且对于我们的用例来说是不可接受的。

如何重现:

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

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

内存不断增长,就好像图像永远不会被释放一样。 我们尝试了什么:

  • 使用 WebView.ClearTemporaryWebDataAsync() 清除缓存,但它没有做任何事情。
  • 手动触发 GC。

注意事项:

  • 我们使用“WebView(WebViewExecutionMode.SeparateThread)”初始化 webview。 (其他执行模式似乎没有帮助)。
  • 我们不使用 WebViewBrush。

【问题讨论】:

    标签: webview uwp uwp-xaml


    【解决方案1】:

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

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

    根据我的经验,您可以将WebView Source 重复设置为“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();
            }
        };      
    }
    

    【讨论】:

    • 这行得通。它仍然有点hacky,但它在实践中有效。有时这需要几分钟才能启动,但它迟早会发生。谢谢尼科。
    猜你喜欢
    • 2016-10-10
    • 2018-06-02
    • 2016-11-02
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 2015-11-22
    相关资源
    最近更新 更多