的Ruby / Rails垃圾收集(Ruby / Rails garbage collection)

2019-06-25 19:47发布

由于HTTP是无状态的,到应用的每个请求创建一个新对象。 如何Rails的清理无用的对象/有多频繁?

Answer 1:

答案很简单:Ruby运行时有一个垃圾收集器。 根据不同的运行时(的JRuby / JVM代GC,IronRuby的/ CLR代GC,经典的Ruby /标记 - 清除GC)使用不同的算法。 但基本是相当简单:

  • 一旦如果出现“可用内存不足”的可分配请求 - 多少是不够是GC算法的成分之一 - 那么GC将开始
  • 在GC开始通过扫描 ,这是全局变量和栈位置(参数和局部变量),以发现哪些对象是还活着; 它标志着找到的每个对象
  • 然后,GC进程看这些对象中的链接(引用),以及递归到那些尚未被标记的那些对象
  • 然后,GC可以开始移动/复制所有标记对象,使他们在内存压缩
  • “自由指针”,从那里发生新的分配,被复位到存储器的这个压实块的端部
  • 如果仍然是“可用内存不足”,则更多的是从操作系统分配
  • 即在扫描过程中没有标明所有的老物件都是垃圾,并通过复制过程和自由指针复位被隐式丢弃。

收集的频率依赖于GC的调谐,这可以由操作系统,物理存储器的量,操作系统内存压力下,用户控制的调整的影响,底层平台版本修订,动态优化参数等大部分它归结为决定在哪里了吧在于,“没有足够的可用内存”的考验,但事情就与代收集更复杂。



Answer 2:

如果你有兴趣在此你应该检查有关通过的Phusion团队副本上写垃圾收集和他们改善对Ruby企业版默认的红宝石GC方案的努力博客系列。

http://izumi.plan99.net/blog/index.php/2007/04/05/saving-memory-in-ruby-on-rails/

在这里系列其他链接:

http://www.rubyenterpriseedition.com/faq.html



文章来源: Ruby / Rails garbage collection