由於http是無狀態的,因此對應用程序的每個請求都會創建一個新對象。 Rails如何清理未使用的對象/多頻繁?Ruby/Rails垃圾回收
7
A
回答
12
答案很簡單:Ruby運行時有一個垃圾收集器。根據運行時間(JRuby/JVM世代GC,IronRuby/CLR世代GC,經典Ruby /標記掃描GC),使用不同的算法。但基本是相當簡單:
- 後,如果出現「可用內存不足」的可分配請求 - 多少是不夠是GC算法的成分之一 - 那麼GC將開始
- 的GC首先掃描根,它們是全局變量和堆棧位置(參數和局部變量),以發現哪些對象仍然存在;它標誌着每個對象找到
- 然後,GC進程看這些對象中的鏈接(引用),以及遞歸到那些尚未被標記
- 然後,GC可以開始移動這些對象/複製所有標記的對象以便它們在內存中被壓縮
- 從新分配發生的「空閒指針」被重置爲該緊湊塊內存的末尾
- 如果仍有「空閒內存不足」,則會分配更多內存來自操作系統
- 在掃描過程中沒有標記的所有舊對象都是垃圾,並且通過th隱式丟棄e複製過程和重置空閒指針。
收集頻率取決於GC的調整,可能受操作系統,物理內存量,操作系統內存壓力,用戶控制調整,底層平臺版本修訂,動態優化參數等。其中很大一部分歸結於決定在「不足的可用內存」測試中哪裏出現問題,儘管事情在世代收集器中變得更加複雜。
5
如果您對此感興趣,您應該查看關於Phusion團隊的寫時複製垃圾收集的博客系列,以及他們在Ruby Enterprise Edition中改進默認ruby gc方案的努力。
http://izumi.plan99.net/blog/index.php/2007/04/05/saving-memory-in-ruby-on-rails/
在這裏系列其他鏈接:
相關問題
- 1. java垃圾回收
- 2. Java:垃圾回收
- 3. Python垃圾回收
- 4. C#垃圾回收
- 5. Erlang垃圾回收
- 6. java - 垃圾回收
- 7. JDBC垃圾回收
- 8. JS垃圾回收
- 9. requestAnimationFrame垃圾回收
- 10. vb.net垃圾回收
- 11. ColdFusion垃圾回收
- 12. PhoneGap垃圾回收
- 13. Chrome垃圾回收
- 14. Java:垃圾回收
- 15. Javascript垃圾回收
- 16. 回收垃圾回收問題
- 17. 垃圾回收無法回收BitmapImage?
- 18. 刪除根垃圾回收
- 19. AIR for iOS垃圾回收
- 20. Java垃圾回收器
- 21. Rebol&Red垃圾回收
- 22. PHP5:SplObjectStorage垃圾回收
- 23. 線程垃圾回收
- 24. 噓,垃圾回收器
- 25. python對象,垃圾回收
- 26. Spidermonkey和垃圾回收
- 27. Java7 vs java5垃圾回收
- 28. context.detach - 用於垃圾回收
- 29. c#和垃圾回收
- 30. 垃圾回收太慢