【发布时间】:2017-12-26 16:41:19
【问题描述】:
我有一个做一些业务工作的 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;
}
}
}
有人遇到过类似的问题吗?还是我错过了什么?
【问题讨论】:
-
那么您是否有实际的性能问题或只是决定测量?
-
是的,我在这种情况下的表现不佳。
-
您可以选择“.NET Memory Allocations”然后向我们展示“Call Stack”面板的内容吗?如果你可以将跟踪文件上传到某个地方就更好了
-
另外,看起来 GC 是在单线程上运行的。启用并发 GC 会让你松一口气。 docs.microsoft.com/en-us/dotnet/framework/configure-apps/…
标签: c# multithreading garbage-collection json.net dottrace