我试图理解Ruby中内存使用背后的想法。我目前正在浏览Rails网络应用和API上的内存问题。
这是一个简单的问题:
如果我在变量中加载许多记录,如下所示:
users = User.where(work: 'cook')
这可能会在我使用此变量的时间内保留在我的应用内存中,对吧?
但是,在我的代码中使用变量后,通过执行以下操作来释放内存会有帮助吗?
users = nil
感谢您的帮助。我也愿意回答有关更广泛主题的问题。
答案 0 :(得分:1)
是的将用户设置为nil确实会减少所需的内存(非常轻微)但是没有必要,因为垃圾收集器最终将扫描它。在生产中,您应该假设您的Ruby进程将随着时间的推移而不断增长,如果您关注内存管理,应该定期重新启动。你在ruby中看到的最大堆空间减少与其随时间的增长相比是最小的所以我不会担心将大型集合设置为nil以节省几个字节这里和那里早于GC将扫描无论如何。 Ruby在由堆页面组成的堆空间中分配对象。假设您使用的是Ruby2.1或更高版本,则堆空间分为used(又名Eden)和empty(aka Tomb)堆页面。在实例化对象时,ruby首先在eden页面中查找可用空间,并且只有在没有可用空间的情况下才会从坟墓中获取页面。然后,当您用nil覆盖对象时,这些堆页面将被添加回坟墓。将页面从eden移动到墓穴会略微减少堆大小,但Ruby的垃圾收集器不会大幅减少它,因为它假定你以前创建了大量的对象,你会再次这样做。我推荐深入研究的一本书是“Ruby性能优化”,因为它深入研究了ruby的垃圾收集器。