请注意,这些变量只适用于 Ruby 2.1 及之后的版本。对于 2.1 之前的版本,可能缺少某一个变量,或者变量不是使用这个名字。
RUBY_GC_HEAP_GROWTH_FACTOR 默认值 1.8,它用于当 Ruby 的堆没有足够的空间来分配内存的时候,每次应该增加多少。当你需要使用大量的对象的时候,你希望堆的内存空间增长的快一点。在这种场合,你需要增加该因子的大小。
内存限制是用于定义当你需要向操作系统的堆申请空间的时候,GC 被触发的频率。Ruby 2.1 及之后的版本,默认的限额为:
New generation malloc limit RUBY_GC_MALLOC_LIMIT 16M Maximum new generation malloc limit RUBY_GC_MALLOC_LIMIT_MAX 32M Old generation malloc limit RUBY_GC_OLDMALLOC_LIMIT 16M Maximum old generation malloc limit RUBY_GC_OLDMALLOC_LIMIT_MAX 128M
让我简要的说明一下这些值的意义。通过设置以上的值,每次新对象分配 16M 到 32M 之间,并且旧对象每占用 16M 到 128M 之间的时候 (“旧对象” 的意思是,该对象至少被垃圾回收调用过一次), Ruby 将运行 GC。Ruby 会根据你的内存模式,动态的调整当前的限额值。
所以,当你只有少数几个对象,却占用了大量的内存(例如读取一个很大的文件到字符串对象中),你可以增加该限额,以减少 GC 被触发的频率。请记住,要同时增加 4 个限额值,而且最好是该默认值的倍数。
我的建议是可能和其他人的建议不一样。对我可能合适,但对于你却未必。这些文章将介绍,哪些对 Twitter 适用,而哪些对 Discourse 适用。
2.6 Profile
有时候,这些建议未必就是通用。你需要弄清楚你的问题。这时候,你就要使用 profiler。Ruby-Prof 是每个 Ruby 用户都会使用的工具。
想知道更多关于 profiling 的知识, 请阅读 Chris Heald's 和我的关于在 Rails 中 使用ruby-prof 的文章。还有一些也许有点过时的关于 memory profiling 的建议.
2.7 编写性能测试用例
最后,提高 Rails 性能的技巧中,虽然不是最重要的,就是确认应用的性能不会因你修改了代码而导致性能再次下降。
3 总结感言
对于一篇文章中,对于如何提高 Ruby 和 Rails 的性能,要面面俱到,确实不可能。所以,在这之后,我会通过写一本书来总结我的经验。如果你觉得我的建议有用,请登记 mailinglist ,当我准备好了该书的预览版之后,将会第一时间通知你。现在,让我们一起来动手,让 Rails 应用跑得更快一些吧!










