7

我正在尝试解决 Rails 的内存泄漏问题。我可以通过 New Relic 看到,内存的使用量一直在增加,而从未减少。

这是一个大线程的衍生问题(Rails 应用程序中的内存不断增加),我在其中遇到了问题。我现在需要知道的只是:

Rails 内存泄漏的主要原因/因素是什么?

据我所理解:

  • 全局变量(例如@@variable)——我没有这些

  • 符号(我没有专门创建任何符号)

  • 会话 - 这里应该避免什么?假设我有一个会话来跟踪一个特定用户在对站点进行文本搜索时使用的最后一个查询。我该怎么杀掉它?

  • “留下参考” - 这到底是什么意思?你能举个例子吗?

  • 您可以提供的任何其他通常会造成内存泄漏的糟糕编码示例?

我想使用这些信息来查看我的代码,所以请提供示例!

最后,这会是“内存泄漏代码”吗?

ProductController
...
@last_products << Product.order("ASC").limit(5)
end

这会让@last_products 膨胀吗?

4

1 回答 1

8

以下将破坏应用程序。

Foo.each do |bar|
  #Whatever
end

如果您有很多 Foos 会将它们全部拉入内存。我见过应用程序爆炸,因为它们有一堆“Foos”,并且他们有一个贯穿所有 foos 的 rake 任务,而这个 rake 任务需要永远,比如说Y 秒,但每X秒运行一次,其中X <是。所以发生的事情是,他们现在不止一次地把所有的 Foos 都放在了内存中,因为他们只是一遍又一遍地把东西拉进内存。

虽然这不能完全发生在面向前端的 Web 应用程序中,但它并不完全有效或不想要。

代替上述方法,请执行以下操作

Foo.find_each do |bar|
  #Whatever
end

它检索事物和批次,并且不会一次将一大堆东西全部放入您的记忆中。

就在我写完这个的时候,我意识到这个问题是在去年 9 月被问到的……哦,天哪……

于 2013-04-05T22:02:07.700 回答