ruby-on-rails - 内存在 Ruby 中是如何工作的?

标签 ruby-on-rails ruby memory

我试图理解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/

相关文章:

sql - Acts-as-taggable-on 按上下文查找所有标签

ruby-on-rails - Ruby on rails 适用于 Windows 的最佳 IDE

ruby-on-rails - sidekiq Ruby 脚本后 Postgres 连接未关闭

c++ - 段错误错误 C++

java - 具有数千万用户的现实社交网络模型。我应该使用哪些技术?

ruby-on-rails - 如何正确使用具有唯一性验证的 shoulda 匹配器?

ruby-on-rails - 多个Rake版本——最佳实践

ruby-on-rails - 受控用户组的 Heroku SSL 证书

c - 关于 char *buffer 和 char buffer[5] 的内存分配

ruby-on-rails - 带 Mongoid 的 Rails 引擎