为什么垃圾收集在 Windows 10 UWP 应用中运行过于频繁?

vad*_*lis 5 c# windows garbage-collection win-universal-app windows-10-mobile

为什么垃圾回收会阻塞 Windows 10 UWP 中的 UI 线程?(可能不会。但性能诊断工具说垃圾收集器正在 UI 线程中运行) 阻塞 UI 线程 如果垃圾收集正在运行,应用程序也没有响应。在 Windows Phone 8.1 中,它运行良好,并且不会如此频繁地调用垃圾收集。 Windows 10 UWP 垃圾收集

更新: 来自诊断工具的更新结果: 在此处输入图片说明

更新 2 我需要从外部 API 获取大对象(过去 2 年每月 1000-2000 个对象)。API以json格式返回数据。我使用 Newtonsoft.Json 来反序列化对象。因此,从 API 请求每个请求获取 1-2 mb 的临时数据是理想的行为。我使用 FieldMedic 分析了来自设备的 PerfView 日志,发现集合的反序列化是最昂贵的操作。Windows Phone 8.1 的结果相同。仅在 Windows 10 中的 JITStats 方法数量 6,734 与 WP 8.1 中的 421 的巨大差异 在此处输入图片说明

Windows Phone 8.1 的同一个应用程序不会阻塞 UI 线程。 在此处输入图片说明 问题是“为什么 Windows 10 UWP 中的垃圾收集需要这么多资源?”。

更新 3 Demo 项目演示了差异。在 WP8.1 UI 线程不能被 json 序列化/反序列化阻塞。在 Windows 10 UI 线程被 GC 阻塞。

private void StartButton_OnClick(object sender, RoutedEventArgs e)
    {        
        Task.Factory.StartNew(async () =>
        {
            var storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///trips.json"));
            var content = await FileIO.ReadTextAsync(storageFile);
            for (int i = 0; i < 100; i++)
            {
                var trips = JsonConvert.DeserializeObject<IEnumerable<Trip>>(content);                    
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

演示项目链接: gc_test