【问题标题】:Why querying a large number of fields causes memory leak symptoms?为什么查询大量字段会导致内存泄漏症状?
【发布时间】:2015-01-22 00:03:00
【问题描述】:

我有一个关于this 非常有用的文章中描述为“低效内存使用”的问题。这篇文章表明,内存使用效率低下会导致内存急剧增长......我的意思是 - 戏剧性。

要回答我的问题,请先查看the article

我的问题是:任何人都可以解释为什么 GC 的行为方式如文章的“低效内存使用”部分所示的那样吗?即使在触发 GC 之后,内存水平仍然会缓慢但肯定会上升。

我已经编辑了问题,以便更好地关注我的具体查询。一个好的答案将帮助许多开发人员更好地了解 GC,从而开发出更好的软件。

非常感谢!

【问题讨论】:

  • 您无法使用一般描述来诊断特定问题。您正在查询数据库并返回比需要更多的数据是内存问题,当然,但这并不意味着它会造成内存泄漏。要找出具体您遇到的问题,您需要使用一种工具来检测内存泄漏并将其显示给您。
  • 研究使用 JetBrains 的 dotTrace Memory Profiles、ANTS Memory Profiler 或任何其他内存分析器。
  • 你应该运行一个内存分析器来查看哪些东西仍然被分配。或者您可以向我们展示一个可验证的最小示例,以便我们可以重现该问题。通常,当您将内容放入永远不会释放的静态位置(例如内存会话存储)时,就会出现此问题。
  • 你收到OutOfMemoryExceptions 了吗?不?它按预期工作,这就是 GC 的工作方式。
  • 感谢大家的建议。我们使用 ANTS 内存分析器来确定问题出在哪里,现在我们知道它的原因是什么。事实上,随着时间的推移,我们会得到一个 OutOfMemoryException,因为内存没有被回收。即使触发了 GC,也不是所有的东西都会被回收,不管你触发它的频率如何。

标签: c# memory memory-leaks


【解决方案1】:

如果“Web 应用程序正在查询数据库并返回比应用程序所需的结果多得多的结果”,为什么在完成所有查询、关闭所有连接和清除所有相关实体后 GC 不要求返回内存/收拾好了吗?

第一个问题是,为什么数据库会查询并带回更多真正需要的结果?为什么不首先纠正这个问题?

如果你施加了很大的内存压力(经常创建许多稍后要释放的临时数据),GC 实际上会清理它,但是由于创建了这么多数据,它会很慢而且效率很低。

【讨论】:

  • 康拉德,感谢您的回答。请注意,问题是关于我上面提到的文章中的示例,旨在帮助澄清垃圾收集的内部工作原理。这篇文章并不是就如何处理我们遇到的具体问题寻求任何建议——我们需要的所有建议都在上述文章中。
猜你喜欢
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多