【问题标题】:NET Core web.api sudden memory peak after dozen of callsNET Core web.api 在数十次调用后突然出现内存峰值
【发布时间】:2020-06-01 18:44:24
【问题描述】:

我在 .net core 3.1 中有一个 web.api,它不断接收字节数组数据。我注意到,经过十几次调用,内存突然增加了+100Mb。

正如您在 GIF 中看到的那样,内存随着呼叫的处理而稳步增加。然后在 155Mb 时,内存增加到 296Mb

我创建了一个仓库:https://github.com/puppetSpace/MemoryIssue 这包含一个持续调用 API 的客户端项目。 还有 web.api 项目,它从正文中获取字节数组并等待 500 毫秒(模拟工作)。 我只想知道几件事: - 其他人也得到这个结果吗? - 这是正常的行为吗?就像它在保留内存一样?还是仅仅因为调试?

我尝试使用分析器,但无法弄清楚是什么导致了突然增加。

【问题讨论】:

    标签: c# asp.net-core memory .net-core


    【解决方案1】:

    这应该与您的MemoryStream 有关。执行完MemoryStream后需要release,否则会一直占用内存。

    而且由于你当前使用的await是异步操作,所以不需要使用await Task.Delay(500);来延迟。

    修改你的api代码如下:

      public async Task<IActionResult> Post()
        {
            var ms = new MemoryStream();
            await Request.Body.CopyToAsync(ms).ContinueWith(x => ms.Dispose()); 
            return NoContent();
        }
    

    【讨论】:

    【解决方案2】:

    我尝试使用分析器,但无法弄清楚是什么原因导致突然增加

    您可以在共享截图中看到内存从 155 增加到 296 时有黄色标记。这意味着 GC 开始了托管堆垃圾收集。并且当第一次运行时,它会初始化很多对象。您可以在创建详细对象的 GC 之前和之后拍摄快照。

    内存稳定后,我运行代码示例大约 6 分钟来监控内存使用情况,您可以参考下图:

    【讨论】:

    • 嗯,好的。所以没什么好担心的。它只是运行时在做这件事。感谢您的关注。
    • @SebastianSsw,这个答案能帮助您解决问题吗?如果是这样,请接受它作为答案,这将有助于有类似问题的人更容易找到答案。
    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2017-10-23
    相关资源
    最近更新 更多