2009-07-13 185 views

回答

12

答案很簡單:Ruby運行時有一個垃圾收集器。根據運行時間(JRuby/JVM世代GC,IronRuby/CLR世代GC,經典Ruby /標記掃描GC),使用不同的算法。但基本是相當簡單:

  • 後,如果出現「可用內存不足」的可分配請求 - 多少是不夠是GC算法的成分之一 - 那麼GC將開始
  • 的GC首先掃描,它們是全局變量和堆棧位置(參數和局部變量),以發現哪些對象仍然存在;它標誌着每個對象找到
  • 然後,GC進程看這些對象中的鏈接(引用),以及遞歸到那些尚未被標記
  • 然後,GC可以開始移動這些對象/複製所有標記的對象以便它們在內存中被壓縮
  • 從新分配發生的「空閒指針」被重置爲該緊湊塊內存的末尾
  • 如果仍有「空閒內存不足」,則會分配更多內存來自操作系統
  • 在掃描過程中沒有標記的所有舊對象都是垃圾,並且通過th隱式丟棄e複製過程和重置空閒指針。

收集頻率取決於GC的調整,可能受操作系統,物理內存量,操作系統內存壓力,用戶控制調整,底層平臺版本修訂,動態優化參數等。其中很大一部分歸結於決定在「不足的可用內存」測試中哪裏出現問題,儘管事情在世代收集器中變得更加複雜。