0

我在尝试理解内存使用图时遇到问题,希望在内存管理方面更有经验的人能够判断我是否面临内存泄漏问题

为了执行这个测试,我有一个自定义的 PS1 脚本,它将运行一个无限循环并每隔 X 秒持续发布大量数据,这与我在生产中所期望的非常相似。

我的应用是作为 Windows 服务运行的 .NET Core 控制台应用。没有使用第三方组件、外部库、原生 API 等。它是一个典型的多线程应用程序,它发出 HTTP 请求、写入磁盘、向前端应用程序发送通知。

托管与非托管内存演变 在此处输入图像描述

非托管内存释放 在此处输入图像描述

当服务首次启动时,它只使用 33 MB。在第一个请求之后,它会跳转到 100 MB。在每个连续的请求中,内存都会以非常缓慢的速度增长。底部较小的图表显示了我进行测试时当晚的演变。看起来在某些时候内存会稳定在 500-600 MB。我看到托管内存被收集,不像我预期的那样频繁,但最终它被收集了。然而,正如我之前所说,非托管内存遵循自己的趋势,增长非常缓慢甚至稳定。在奇怪的情况下,我会说几乎随机地释放非托管内存(参见第二个捕获),但最终它会再次建立。

您在这里看到内存泄漏模式吗?

4

1 回答 1

0

好的,如果有人面临类似的问题,让我与您分享我自己的研究结果。

这只是 .NET 使用尽可能多的资源。我正在使用 Server GC,当您的应用程序单独运行时效果会更好。证据是,当我开始打开一大堆应用程序时,操作系统从我的应用程序中回收了未使用的内存,并且返回了非托管内存。

Worstation GC 将更急切地释放内存。证明是当我切换到 Workstation GC 时,我的内存使用量从超过 200MB 变成了不到 40MB。CPU增加了一点点,但没什么好担心的。

希望这个解释对某人有所帮助。干杯

于 2019-07-13T22:47:10.857 回答