ruby - Rails 算法后内存泄漏?

标签 ruby algorithm memory-leaks garbage-collection

我受合并排序的合并部分启发编写了一个算法。

  def self.merge(arr)
    if arr.length == 1
      return arr
    end
    groups = []
    (0...-(-arr.length/2)).each do |i|
      groups << []
      if !arr[2*i+1].nil?
        arr[2*i].each do |cal1|
          arr[2*i+1].each do |cal2|
            mergecal = func(cal1,cal2)
            if mergecal
              groups[i] << mergecal
            else
              mergecal = nil
            end
          end
        end
      else
        groups[i] = arr[2*i]
      end
    end
    arr = nil
    return merge(groups)
  end

呈现使用此算法的页面后,任务管理器报告了大约 500MB 的 RAM 使用情况。然后再次刷新同一个页面,内存使用量现在达到了 1GB。我尝试在函数调用之后将 GC.start(full_mark: true) 添加到 Controller ,但似乎没有任何改变。我不确定内存泄漏是否与我的代码或 Ruby 本身有关。

最佳答案

Ruby 垃圾回收不会立即减少您的 Ruby 程序分配的内存量。内存分配非常昂贵,因此即使您创建的对象立即被 GC 收集,内存也会慢慢释放回操作系统。如果您认为此函数存在内存泄漏,您应该尝试在非 Rails 进程中运行它,这样您可以更好地控制对象生命周期。您可以使用 GC.stat在运行 GC 之前和之后获取有关事件对象和空闲对象数量的信息。我喜欢 ruby​​ GC 的工作原理也值得一读 this article .

关于ruby - Rails 算法后内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41581729/

相关文章:

ruby-on-rails - Gem::Ext::BuildError:错误:无法构建 gem native 扩展。 - tharindu

ruby - 如何在 Ruby 中有效地迭代和更新大字符串?

algorithm - 如何有效地多样化 Dijkstra 算法(同时保留最短路径)?

visual-c++ - 使用 SQLite 时出现大量内存泄漏

ruby - 如何在 vim 中删除 ruby​​ 周围的 block (做/结束)

css - 如果存在多个节点,则 xpath 仅获取一个节点

c++ - 在完美图中寻找最大团

r - 更快的加权采样,无需替换

java - 尝试了解此堆分析以确定内存泄漏或仅需要大量内存

ios - swift : Game starts to lag mid way