我对 Azure-app-service-webjob 的生产中的内存泄漏感到头疼。
这是一个后台工作进程,按计划从队列中读取工作。大约每 10 分钟,内存使用量就会达到峰值,然后(大约 10 分钟后)会恢复到正常基线。每个尖峰每次都略高。直到最终,峰值达到足够高(> 80% 说),因此需要越来越长的时间才能返回基线,最后锁定。
我已经非常详细地登录了。没有大量或大量的数据库查询,并且没有任何处理操作花费超过几秒钟的时间。很难获得非常清晰的跟踪,因为在 10 分钟的周期内可能会发生 15-30 次不同的操作。
反正。不久前,当它处于“最大化”阶段时,我得到了一个完整的内存转储,将其插入 WinDbg。尽管数据库中只有几千个,但内存中有数百万个某种类型的实体框架 (6) 实体。
我无法在本地复制。所以我在这个实体类型的构造函数中添加了一些代码——它保留了从构造函数中看到Dictionary<string,long>某个特定的次数。Environment.StackTrace我正在等待“最大化”发生,但是远程连接,目前看起来很标准/正常。
鉴于这些对象/可能/随着时间的推移而增加,但这并不能解释增加的峰值并返回基线。可以?
我还刚刚在“基线”期间捕获了完整的内存转储,然后是“小峰值”(根据图像仅运行了几个小时)。我有基本的 WinDbg 技能。
无论如何,我的问题/混淆的原因:
- 如何确定两个完整内存转储之间的差异?
- 有没有人见过这样的事情?
- 什么可能导致内存中的峰值每次都增长?
- 如果它是内存泄漏,为什么它会在峰值之间返回到基线?
我想认为没有魔法发生,但我根本找不到与尖峰相吻合的东西:
- 数据库记录的数量逐渐增加,但只有几千条,如果进程重新启动,内存问题会重新设置
- 尽管峰值持续约 10 分钟,但根据日志记录,似乎没有任何操作需要超过几秒钟

