小编kor*_*ucu的帖子

.net内存未回收

我有一个'服务'(owin/webapi + odp.net托管),在x64机器上运行'server gc mode'.执行测试套件后,内存使用量约为2Gb.我'在那台机器上产生了'内存压力'(另一个消耗了所有可用内存的程序).我原以为Windows会强制.net释放一些内存.但事实并非如此.这是windbg的输出:

0:018> !dumpheap -stat
Statistics:
              MT    Count    TotalSize Class Name
00007ffd10445b90        1           24 System.Collections.Generic.GenericEqualityComparer`1[[System.UInt64, mscorlib]]
...
00007ffd0f904918   100864     11616976 System.Object[]
0000005b19face20       84   1810674044      Free
Total 720544 objects
Fragmented blocks larger than 0.5 MB:
            Addr     Size      Followed by
0000005b1c3c8800  425.6MB 0000005b36d56c50 System.Func`2[[System.IAsyncResult, mscorlib],[System.Net.HttpListenerContext, System]]
0000005c1c3fcf00   28.2MB 0000005c1e02be58 System.Reflection.Emit.MethodBuilder
0000005c1e02e5b0  268.0MB 0000005c2ec313d8 System.Threading.OverlappedData
0000005c2ec31678  142.3MB 0000005c37a830a0 System.Func`2[[System.IAsyncResult, mscorlib],[System.Net.HttpListenerContext, System]]
0000005d1c541aa0  404.8MB 0000005d35a1a958 System.Func`2[[System.IAsyncResult, mscorlib],[System.Net.HttpListenerContext, System]]
0000005d35a1e5a8    3.8MB 0000005d35df0c40 System.Func`2[[System.IAsyncResult, mscorlib],[System.Net.HttpListenerContext, System]]
0000005e1cfe7128  444.1MB 0000005e38c0c3f0 System.Byte[]
0000005e38c8cfb8    4.5MB 0000005e39110988 …
Run Code Online (Sandbox Code Playgroud)

.net garbage-collection

10
推荐指数
1
解决办法
782
查看次数

为什么HttpClient.PostAsync缓冲区响应?

最近我在.Net 4.5.1上使用HttpClients.PostAsync时遇到了性能问题.最初服务器(Owin + WebApi)在发送之前缓冲响应.这导致了巨大的内存使用开销(序列化响应大小> 1Gb).在我打开服务器上的响应流后,客户端字面上停止工作.事实证明,当从服务器读取响应时,原因是客户端上的缓冲区重新分配.我检查了HttpClient实现,并在HttpClient.SendAsync方法中找到了这个有趣的部分:

if (result.Content == null || completionOption == HttpCompletionOption.ResponseHeadersRead)
{
    this.SetTaskCompleted(request, linkedCts, tcs, result);
}
else
{
    this.StartContentBuffering(request, linkedCts, tcs, result);
}
Run Code Online (Sandbox Code Playgroud)

所以什么时候completionOptionResponseHeadersRead响应总是缓冲.根据SendAsync文档,SendAsync的实现与意图一致.

现在,正如PostAsync实现发送一样ResponseContentRead,响应流总是在POST上缓冲.所以问题是为什么PostAsync必须等待(和缓冲)整个响应才能在处理继续之前到达?

c# httpclient

4
推荐指数
1
解决办法
2393
查看次数

标签 统计

.net ×1

c# ×1

garbage-collection ×1

httpclient ×1