我试图找出ruby进程中内存使用的问题。我尝试使用ObjectSpace模块进行ruby进程的堆转储,以了解发生了什么。令人费解的是," top" linux中的命令报告该进程使用17.8 GB的虚拟内存和15GB的驻留内存。但是,堆转储的大小仅为2.7-2.9 GB左右。
基于Ruby文档,Objectspace.dump_all方法将ruby堆的内容转储为JSON。
我无法理解剩下的内存是什么。如果有人能帮我理解发生了什么,那将会很有帮助。
谢谢。
答案 0 :(得分:1)
您的应用程序可能正在分配随后由垃圾收集器整理的对象。您可以使用a call to GC.stat
Ruby does not release memory back to the operating system以任何有意义的方式。 (如果您正在运行MRI)因此,如果您分配18GB内存并且15GB内存被垃圾收集,那么您最终将获得~3GB的堆数据。
Ruby MRI GC不是压缩垃圾收集器,因此只要堆中有任何数据,堆就不会被释放。这会导致内存碎片以及您在应用中看到的值。