代码之家  ›  专栏  ›  技术社区  ›  jpemberthy

Ruby/Rails内存使用情况

  •  0
  • jpemberthy  · 技术社区  · 16 年前

    嘿,伙计们,代码如下:

      def process(batch_size=1000)
         claim_numbers.each_slice(batch_size) do |numbers_batch|
           claims = Claim.find(:all, :conditions => ["claim_number in (?)", numbers_batch])
           # do something with claims
         end
       end
    

    在我的一个Rails模型中,我处理了很多 claim_numbers ,我在模拟 find_in_batches 方法为了不将大量记录加载到内存中, 那么我的问题是 :在内存方面,发生了什么 claims 每次迭代中的变量?Ruby的GC何时释放这部分内存?

    如有任何帮助和提示,请提前感谢!

    更新: 使用Ruby 1.8.7-P72

    1 回复  |  直到 16 年前
        1
  •  1
  •   xinit    16 年前

    一旦GC运行,Ruby就会释放内存。由于声明的作用域在每个切片块内,因此声明在块外将没有引用,并且当重新分配声明时(由于下一次迭代),以前分配的对象将变为未引用。 每个对象的内存保留到GC启动为止。可以使用一些环境变量指定GC运行的频率(更多信息请参见 http://blog.evanweaver.com/articles/2009/04/09/ruby-gc-tuning/ )

    如果出于某种原因保留了对象(因为仍然存在对它的引用,例如将对象放入数组或哈希中),则不会释放该对象的内存。 如果你监视你的应用程序,你可以看到内存使用量的增加,同时CPU使用量的增加,因为Ruby的GC是非代性的,这意味着它每次都会覆盖所有的对象,以查看它们是否可以被收集。