ruby - 跟踪 Ruby 代码中的内存泄漏

标签 ruby activerecord memory-leaks

我不是追查这些事情的专家,但下面的事情似乎是问题的根源,只是想检查我是否正确,以及如何处理它:

所有脚本基本上都是一个大循环,每次迭代都执行以下操作,我认为可能与泄漏有关:

  1. Mechanize 对象用于获取远程页面
  2. 调用一个函数来获取或初始化 AR 对象,但这发生在同名变量上
  3. 总是初始化另外两个对象,但相应地使用相同的名称

我认为,由于新创建的对象被分配给同名变量,垃圾收集机制应该处理这个问题......


更新:我的代码的简化版本

runner.rb 每天由 cronjob 运行,它基本上生成其他脚本列表 - 蜘蛛:

['spider1_path', 'spider2_path', .. ].each do |spider_path|
  Process.detach( fork { exec "ruby #{spider_path}" } )
end

蜘蛛.rb

# This is the main bit
#
agent = Mechanize.new { |agent|
  agent.user_agent_alias = 'Mac Safari'
}

categories_urls = get_list_of_categories_links_for_website('a')
categories_urls.each do |category_url|
  next_page = category_url
  while next_page
    doc = fetch_page( next_page, agent )
    cat_page = CategoryPage.new( doc )
    urls_of_sub_pages = cat_page.get_urls_of_sub_pages
    
    urls_of_sub_pages.each do |url|
      page_doc = fetch_page( url, agent )
      sub_page = SubPage.new( page_doc )
      sub_page.parse!
      sub_page.insert
    end
    next_page = cat_page.get_next_page
    # this bit bellow didn't help
    GC.start
  end
end

...

def fetch_page( a, url )
  a.get url
end

...

class SubPage
  ...
  def parse!
    # @doc - result of `fetch_page`
    @parser = @doc.parser
    # do some scraping using @parser
    # accumulate @attrs hash with necessary information
  end
  ...

  def insert
    ad = Ad.where('advert_id = ?', @attrs['advert_id']).first
    if ad
      ad.update_attributes( @attrs )
    else
      ad = Ad.create(@attrs)
    end
  end
end

最佳答案

您是否尝试过在调用 GC.start 时偶尔手动触发垃圾收集?我发现在某些情况下,Ruby 会变得 super 懒惰,不会去倒垃圾。

Ruby 通常不会“泄漏”内存,但如果您不小心将它们缓存在某个地方,它可能会累积大量已分配的对象。

关于ruby - 跟踪 Ruby 代码中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9380816/

相关文章:

javascript - 如何将参数从 form_for 方法传递到 Rails 中的 Controller 方法?

ios - Objective-c Opengl 内存泄漏

ruby-on-rails - 如何将数据附加到csv文件

ruby - 如何立即打印标准输出?

ruby-on-rails - Rails 提示属性不存在,但它适用于其他人

mysql - 两个不同协会的 Rails 订单

ruby-on-rails - Rails 5 - 多个外键属于同一个表

ruby-on-rails - 为什么这种迁移是不可逆的? (更改表、重命名、文本)

javascript - 我们需要在 JavaScript 中使用 “unset” 变量吗?

visual-c++ - `static char THIS_FILE[] = __FILE__;` 有什么意义?