Ruby / Rails 垃圾回收

8

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

2个回答

13
简单来说:Ruby运行时拥有垃圾收集器。根据不同的运行时(JRuby/JVM分代GC,IronRuby/CLR分代GC,经典Ruby/标记-扫描GC)使用不同的算法。但基础知识非常简单:
  • 在分配请求时,如果没有足够的可用内存 - 不足多少是GC算法的一个因素-那么将启动GC
  • GC从扫描roots开始,这些是全局变量和堆栈位置(参数和本地变量),以发现哪些对象仍然存在;它标记它找到的每个对象。
  • 然后,GC进程查看这些对象中的链接(引用),并递归到那些尚未被标记的对象中。
  • 然后,GC可以开始移动/复制所有标记的对象,使其在内存中紧凑。
  • "自由指针",从中进行新分配的位置被重置为该内存块的末端。
  • 如果仍然“没有足够的可用内存”,则会从操作系统中分配更多的内存。
  • 在扫描过程中未被标记的所有旧对象都是垃圾,并通过复制过程和重置自由指针隐式丢弃。

收集频率取决于GC的调整,可能会受操作系统、物理内存量、操作系统内存压力、用户控制的微调、底层平台版本修订、动态优化参数等影响。很多时候,这归结为决定那个“不足可用内存”的基准线在哪里,但使用分代收集器会更加复杂。


5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接