2017-07-24 53 views
1

我想弄清楚在ruby進程中內存使用情況的問題。我嘗試使用ObjectSpace模塊獲取ruby進程的堆轉儲,以瞭解發生了什麼。令人費解的是,linux中的「top」命令報告該進程使用了​​17.8 GB的虛擬內存和15 GB的常駐內存。但是,堆轉儲的大小隻有2.7-2.9 GB左右。Ruby進程內存結構

基於Ruby文檔,Objectspace.dump_all方法將ruby堆的內容轉儲爲JSON。

我無法理解什麼是佔用內存的其餘部分。如果有人能幫助我理解發生的事情,這將是有益的。

謝謝。

+1

今年的[Tenderlove在Rubyconf.au上的演講](https://www.youtube.com/watch?v=nAEt36XNtAE)可能會有幫助。 – spickermann

回答

1

很可能您的應用程序正在分配隨後由垃圾收集器修整的對象。您可以在任何有意義的方式與a call toGC.stat

紅寶石does notrelease memoryback to the operating system檢查。 (如果你正在運行核磁共振成像)因此,如果你分配18GB的內存和15GB的垃圾收集,你最終會得到~3GB的堆數據。

Ruby MRI GC不是壓縮垃圾收集器,所以只要堆中有數據,堆就不會被釋放。這會導致內存碎片以及您在應用中看到的值。

+0

我的確看過這篇文章,並瞭解Ruby在一段時間內逐漸將內存釋放到操作系統。我確實定期測量了可用的堆槽,並且一直在2600萬左右。我讀到每個插槽在64位機器中都是40個字節。所以,通過數學計算,它應該是26百萬* 40字節〜991 MB。堆轉儲大小爲2.9 GB,進程的常駐內存大小爲〜15 GB。看起來我仍然缺少連接 – user2492286

+1

[Ruby不會將所有內容都存儲在堆中](https://stackoverflow.com/a/13639298/3784008)超出堆大小的對象將分配給堆外部的內存。除非所有的對象分配都小於40字節,否則Ruby會分配內存來保存它們。 (使用malloc,進一步抽象內存層,從而依賴於操作系統) – anothermh

+0

感謝您提供有價值的信息。瞭解ruby如何管理內存很有幫助。 – user2492286