Hug*_*ugo 7 ruby memory ruby-on-rails
我试图理解Ruby中内存使用背后的想法.我目前正在浏览我的Rails Web应用程序和API上的内存问题.
这是一个简单的问题:
如果我在变量中加载许多记录,如下所示:
users = User.where(work: 'cook')
Run Code Online (Sandbox Code Playgroud)
这可能会在我使用此变量的时候保存在我的应用程序内存中,对吧?
但是在我在代码中使用变量后,通过执行以下操作来释放内存是否有帮助?
users = nil
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助.我也乐于回答有关更广泛主题的问题.
是的,将用户设置为 nil 确实会减少所需的内存(非常轻微),但没有必要,因为垃圾收集器最终会清除它。在生产中,您应该假设您的 Ruby 进程总是会随着时间的推移而增长,并且如果您担心内存管理,则应该定期重新启动。与随着时间的推移而增长的情况相比,您在 ruby 中看到的最大堆空间减少是最小的,因此我不会担心将大型集合设置为 nil 以在 GC 扫描之前稍微节省一些字节。无论如何。Ruby 在由堆页组成的堆空间中分配对象。假设您使用的是 Ruby2.1 或更高版本,堆空间分为已用(又名 Eden)堆页和空(又名 Tomb)堆页。实例化对象时,Ruby 首先在 eden 页面中查找可用空间,只有当没有可用空间时,才会从 tomb 中获取页面。然后,当您用 nil 覆盖该对象时,这些堆页面将被添加回墓中。将页面从伊甸园移动到坟墓会稍微减少堆大小,但是 Ruby 的垃圾收集器不会大幅减少堆大小,因为它假设您以前创建过大量对象集合,您将再次执行此操作。我推荐深入研究的一本书是“Ruby Performance Optimization”,因为它深入介绍了 ruby 的垃圾收集器。