【问题标题】:Should I be concerned about a memory leak?我应该担心内存泄漏吗?
【发布时间】:2011-12-29 20:27:41
【问题描述】:

我是编写 Windows 服务的新手。我决定编写一个通过 Twilio 进行出站呼叫的程序。当我使用实现 IDisposable 的资源时,我正在使用 using 语句。到目前为止,我总共运行了四个小时的服务,这里是我的内存使用情况:

开始:9k

15 分钟:10k

30 分钟:13k

1 小时:13k

2 小时:13k

3 小时:13k

30 分钟后它似乎是一致的(在 13,100 和 13,200 之间),但我不确定为什么在前 30 分钟后仍然分配资源。 OnStart() 方法启动 4 个计时器和一些小对象。我的对象的构建当然不需要 30 分钟。计时器只是等待特定时间,执行查询,然后使用 Twilio 将结果排队并等待下一个事件。

此时我应该担心内存泄漏吗?这样的应用程序正常吗?

【问题讨论】:

  • 这很难说,因为你的内存使用率很低,垃圾收集器可能永远不会启动。尝试运行你的服务几天。
  • 这就是我的想法,但很难确定。谢谢你的帮助!它安装在我的测试服务器上,将在周末运行。我会在星期一提供更新。
  • 我同意@zmbq。只需观察几天,看看会发生什么。内存使用量将根据代码正在执行的操作和垃圾收集器而波动,但应位于平均值范围内。
  • 这个问题是有效的,反对票是怎么回事?
  • @HenkHolterman 数字本身并不能说明任何问题,但问题仍然有效。他认为他们可能是内存泄漏,他提供了他认为有用的信息并希望得到其他人的建议。显然其他人能够提供帮助,这就是这个网站的全部意义......(除了赚钱:)所以这个问题至少对我来说是有效的,但这只是我的意见。

标签: c# memory memory-leaks windows-services memory-management


【解决方案1】:

不,看起来您不需要担心内存泄漏。

在具有数 GB 可用内存的机器上,13k 内存的消耗……微不足道。如果它稳定增长并且从未减少,那么你就有泄漏:否则,你很好。


值得记住的是,CLR 中的字符串是不变的,因此每次“更改”字符串时都会创建一个新副本,并且分配给旧版本的内存会被标记为未使用。所以大多数程序在日常使用中都会消耗一些内存:这是正常的,只有在诸如非常紧密循环或大量集合或两者兼有的边缘条件下需要关注.

即便如此,.NET 垃圾收集器 (GC) 仍能不时地清理和整合这些旧内存。

在某些情况下,可以为字符串(和其他对象)分配内存(和其他资源,例如文件句柄),但在使用后不会释放,这就是您需要使用Dispose() 的地方。

【讨论】:

  • 感谢您提供更详细的解释。您对字符串的看法是有道理的,我只是希望它更加稳定。谢谢!
【解决方案2】:

有根据的猜测可能是,当您执行 HTTP 请求等时,框架仍然会分配一些东西。

此时我不会担心,但如果您真的想担心,您可以随时使用 CLR Profiler 或其他 .NET 内存分析器来查看发生了什么以及是否需要担心。

【讨论】:

  • 谢谢!我将查看 CLR 分析器并尝试注释掉我的 HTTP 请求。我会在星期一给你回复结果。
猜你喜欢
  • 2011-05-24
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 2020-06-25
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多