Ruby / Rails垃圾收集

由于http是无状态的,因此对应用程序的每个请求都会创建一个新对象。 Rails如何清理未使用的对象/频率如何?

简单回答:Ruby运行时有一个垃圾收集器。 根据运行时(JRuby / JVM分代GC,IronRuby / CLR分代GC,经典Ruby /标记扫描GC),使用不同的算法。 但基础知识非常简单:

  • 根据分配请求,如果“可用内存不足”可用 – GC算法的成分之一是多少不足 – 那么GC将开始
  • GC首先扫描 ,它是全局变量和堆栈位置(参数和局部变量),以发现哪些对象仍然存在; 它标记了它找到的每个对象
  • 然后,GC进程查看这些对象内的链接(引用),并递归到那些尚未标记的对象
  • 然后,GC可以开始移动/复制所有标记的对象,以便它们在内存中压缩
  • 从新分配发生的“自由指针”被重置为这个压缩的内存块的末尾
  • 如果仍有“空闲内存不足”,则从操作系统分配更多内存
  • 在扫描过程中未标记的所有旧对象都是垃圾,并通过复制过程和重置空闲指针隐式丢弃。

收集的频率取决于GC的调整,可能受操作系统,物理内存量,操作系统内存压力,用户控制调整,底层平台版本修订,动态优化参数等的影响。大部分它归结为决定酒吧所处的“免费记忆不足”测试,尽管世代collections家的事情变得更加复杂。

如果您对此感兴趣,请查看Phusion团队关于写时复制垃圾收集的博客系列,以及他们为改进Ruby Enterprise Edition中的默认ruby gc方案所做的努力。

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

这个系列中的其他链接:

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