【问题标题】:Ruby process memory structureRuby进程内存结构
【发布时间】:2017-07-24 17:02:03
【问题描述】:

我正在尝试找出 ruby​​ 进程中的内存使用问题。我尝试使用 ObjectSpace 模块对 ruby​​ 进程进行堆转储,以了解发生了什么。令人费解的是,linux 中的“top”命令报告该进程使用了​​ 17.8 GB 的虚拟内存和 15 GB 的常驻内存。但是,堆转储的大小只有 2.7-2.9 GB 左右。

基于 Ruby 文档,Objectspace.dump_all 方法将 ruby​​ 堆的内容转储为 JSON。

我无法理解是什么占用了其余的内存。如果有人可以帮助我了解正在发生的事情,那将会很有帮助。

谢谢。

【问题讨论】:

标签: ruby-on-rails ruby memory garbage-collection


【解决方案1】:

您的应用程序很可能正在分配由垃圾收集器整理的对象。你可以通过a call toGC.stat查看这个

Ruby does not release memory back to the operating system 以任何有意义的方式。 (如果您正在运行 MRI)因此,如果您分配 18GB 的​​内存并且 15GB 被垃圾收集,那么您最终会得到大约 3GB 的堆数据。

Ruby MRI GC 不是一个压缩垃圾收集器,所以只要堆中有任何数据,堆就不会被释放。这会导致内存碎片和您在应用中看到的值。

【讨论】:

  • 我确实阅读了这篇文章,了解到 Ruby 会在一段时间内逐渐将内存释放给操作系统。我确实定期测量了可用的堆槽,它一直在 2600 万左右。我读到每个插槽在 64 位机器中是 40 个字节。因此,通过数学计算,它应该是 2600 万 * 40 字节 ~ 991 MB。堆转储大小为 2.9 GB,进程的常驻内存大小约为 15 GB。看起来我仍然缺少连接
  • Ruby doesn't store everything in the heap. 大小超过堆的对象被分配到堆外的内存。除非您所有的对象分配都小于 40 字节,否则 Ruby 会分配内存来保存它们。 (使用malloc,进一步抽象了内存层,从而依赖于操作系统)
  • 感谢您提供宝贵的信息。了解 ruby​​ 如何管理内存很有帮助。
  • 有没有办法分析是什么占用了剩余内存?堆转储中的 memsize 字段是仅报告使用的堆大小还是考虑了堆外对象使用的内存?
  • 我不确定,但是像heapy 这样的工具以及作者的这篇two part 文章系列可能会帮助您找到答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
相关资源
最近更新 更多