2

我有一个做一些业务工作的 Windows 服务。我用 dotTrace 对其进行分析以发现性能问题并有这样的图片: GC Wait 88%

GC Wait 需要 88% 的时间似乎很奇怪,所以我关闭了一些小间隔并得到: Thread stats

我发现在非阻塞期间,线程通过 JSON.Net 反序列化分配对象,并且这段代码被 GC 阻塞:

    using (var response = await _httpClient.SendAsync(request, combinedTokenSource.Token))
    {
        response.EnsureSuccessStatusCode();
        if (response.Content == null)
            throw new InvalidOperationException("No HTTP response received.");

        using (var responseStream = await response.Content.ReadAsStreamAsync())
        {
            using (var textReader = new JsonTextReader(new StreamReader(responseStream)))
            {
                var results = new JsonSerializer().Deserialize<ElasticResponse>(textReader);
                return results;
            }
        }
    }

有没有人有类似的问题?还是我错过了什么?

4

2 回答 2

3

最后我发现我的应用程序不使用“后台服务器垃圾收集”(微软说它在 .net 4.5 - gc 描述中是默认的)。所以我添加到配置:

   <runtime>  
      <gcServer enabled="true"/>  
   </runtime>

它将 GC 等待时间减少到 8.5%,因此我获得了 5 倍的性能进步。

于 2017-12-27T13:59:11.453 回答
0

默认为工作站 GC

Workstation GC 在所有托管应用程序中默认使用,最适合 UI 应用程序

于 2017-12-28T02:18:11.857 回答