由于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. 垃圾回收太慢