【问题标题】:Memory Leaks in my Ruby on Rails Application我的 Ruby on Rails 应用程序中的内存泄漏
【发布时间】:2016-04-26 06:40:22
【问题描述】:

我的应用程序调用一堆 API,这些 API 返回大量数据,这些数据在我的控制器内部进行操作以提供各种见解(传递到我的视图中)。

问题是我的应用程序中一直存在内存泄漏,我目前需要在几次请求后重新启动我的应用程序。

另外,我一直在缓存我的所有 api 调用以提高我的应用程序的性能。我的大部分数据在由 api 返回时以哈希的形式存储,并且这些数据被操纵(使用 groupby 进行复制)。

我正在使用 Ruby 1.9 和 Rails 3.2。我需要知道如何从我的应用程序中删除此内存泄漏。

【问题讨论】:

  • 你确定你有内存泄漏或者你的缓存有可能耗尽内存(因为这就是缓存的作用)?此外,您可能想发布您的代码 - 没有代码,我们所能做的就是猜测......
  • 我看过缓存文件夹的大小,好像不是太大,20MB左右。我会发布代码,但是依赖于其他模块太复杂了。我正在寻找我们程序员在 RoR 中会导致内存泄漏的常见陷阱。
  • 附带说明:Ruby 1.9Rails 3.2 都已过时。此版本不会有任何错误修复或安全更新。您可以考虑升级到较新的版本。

标签: ruby-on-rails ruby memory-leaks ruby-on-rails-3.2


【解决方案1】:

您应该确认,您确实存在内存泄漏而不是内存膨胀。 你可以阅读关于 ruby​​ GC here

GC.stat[:heap_live_slot] - 这个代表上次GC后没有被清除的对象。如果这个数字逐个请求稳步增加,那么您可以确定您有内存泄漏。

【讨论】:

  • 这是一个很好的开始方式。我很确定我有内存泄漏而不是膨胀,因为在一定数量的请求之后我的应用程序崩溃了。控制器中的处理过多是否会影响它,我应该将更多的逻辑移动到模块中吗?
  • 它给出的数字是以字节为单位的吗?
  • 不,这只是对对象的引用计数。
【解决方案2】:

首先,您可以先检查存在内存泄漏的 Ruby gem 列表。

参考 (https://github.com/ASoftCo/leaky-gems)

【讨论】:

  • 不。。我不使用任何这些宝石,但确实是一个有用的列表。
【解决方案3】:

您可以使用 bundler-leak gem 来查找 gem 依赖项中的内存泄漏。

https://github.com/rubymem/bundler-leak

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 2011-07-19
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多