2009-07-13 118 views

回答

12

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

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

收集频率取决于GC的调整,可能受操作系统,物理内存量,操作系统内存压力,用户控制调整,底层平台版本修订,动态优化参数等。其中很大一部分归结于决定在“不足的可用内存”测试中哪里出现问题,尽管事情在世代收集器中变得更加复杂。