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