【问题标题】:How can I tell if I have a memory leak?如何判断我是否有内存泄漏?
【发布时间】:2012-03-29 15:50:36
【问题描述】:

我正在使用 ANTS 内存分析器,目前有点困惑。如果我加载我的网站并将 ANTS 连接到该进程,我可以看到大约 90mb 的私有字节,然后我多次运行相同的例程,结果如下:

  1. 109mb
  2. 120mb
  3. 125mb
  4. 126mb
  5. 123mb
  6. 126mb

并且每次尝试之后它基本上保持在 126mb 左右。我的理解是,如果我有内存泄漏,那么它会keep 上升而不是稳定,但我不明白为什么它会缓慢增长到 126mb。 .NET 是否有允许保留的内存量并且刚刚达到该限制?

简单的问题:记忆增长到一定程度然后停止。这对于 .NET 应用程序是否正常?

编辑:刚刚意识到我可能应该在programmers.stackexchange.com上发布这个 - 道歉。

【问题讨论】:

  • 需要更多信息。发布代码并提出具体问题。
  • 带有内存分析工具!
  • 不可能发布整个应用程序的代码。问题很简单:内存累积到某个点然后停止。这是否归结为 .NET。
  • 做你的功课,分析你的应用程序,看看哪些对象留在内存中
  • 当我对其进行分析时,我看到了很多我没有专门调用或创建的 .NET 对象。我怎么知道哪些是应该存在的?只是补充一点:在分析表明它们被正确清除时,我的应用程序类都不存在。今天人潮汹涌……

标签: c# memory memory-management memory-leaks red-gate-ants


【解决方案1】:

“内存泄漏”是指分配认为不应该分配的内存。

不可能简单地查看消耗的内存量并说“你有内存泄漏”。 IE。如果您的应用程序在内存中收集日志 3 天怎么办?在这种情况下,内存消耗会增加,但这并不表示泄漏。另一方面,如果您的应用程序只是每分钟打印一行,但内存使用量不断增长,则很可能是泄漏。

【讨论】:

  • 好的,好点。该应用程序不会故意将任何内容保存在内存中。它基本上是打开数据集并执行 SQL 查询。我不明白它是如何达到一定程度然后停止增长的。
  • @webnoob well DataSets 是内存中的集合,可以做一些缓存。加载后,它会从内存中提供数据而无需访问数据库(这是我的猜测)。
【解决方案2】:

根据我的经验,如果我看到内存增长并趋于平稳,通常是由于缓存。如前所述,内存泄漏只是指内存中保留了一些你认为应该被释放的东西。使用分析器是确定泄漏的好方法(与使用任务管理器相比),因为它通常会确保发生第二代垃圾收集,让您可以查看仍在内存中的所有内容。

当我分析时,我通常会执行几次我想测试的命令以确保所有缓存都已发生,然后我将创建一个前后快照并比较内存的增量。如果您使用的是 C# 之类的托管语言,则 +/- 10KB 的增量并不少见。多次重复该过程,如果您的增量始终为正,则您很可能存在泄漏(假设您不是故意分配更多内存)。

【讨论】:

    猜你喜欢
    • 2014-08-09
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多