2016-07-29 32 views
1

我在Google上閱讀了很多ruby並沒有將操作系統釋放回操作系統的內容,我也理解這一點,因爲從操作系統分配內存是一個代價高昂的過程。在紅寶石上運行手動GC是不是很好的做法

這使我問這個

如果開發者想要的Ruby紅寶石他們怎麼辦呢釋放內存回OS。

- 我想答案是在Ruby中手動觸發GC

但是建議在生產應用程序上執行(運行手動GC)。

我正在考慮在Celluloid中創建一個單獨的線程(或Actor),以便每2小時啓動一次GC。

任何人都可以提出建議。上述解決方案是否適合生產?

注:我想我也知道GC.start(指停止整個世界紅寶石)

注:紅寶石版本2.2.2 MRI Centos的4G內存與4核心。

這裏是此問題http://pastebin.com/rYdYwxLJ

回答

2

的原因,你可能誤會你已經通過谷歌鏈接閱讀的內容。內存,Ruby(這裏和之後我的意思是MRI作爲默認的Ruby實現)不釋放回OS(所謂的Ruby堆),是沒有發佈到操作系統。期。

你有沒有能力迫使紅寶石釋放紅寶石堆回OS(除了整個應用程序的冷啓動。)

可能被釋放回操作系統,是由紅寶石發佈在內部和它是一個不好的做法通過手段手動調用GC,在99%的情況下會減慢應用程序的運行速度,剩下的1%則完全沒有效果。

+0

禁用GC有時可以提高速度,在非常特殊的情況下(如要生成數百萬個對象,只有臨時對象的一個​​小的開銷關心期間生成過程)。 –

+0

@NeilSlater是,_disabling_ GC可能會提高在某些情況下的速度,但我從_manually運行GC_預防。而且,在任何情況下,這樣的行動不應該對SO :) – mudasobwa

4

我在Google上讀了很多,ruby並沒有將操作系統釋放回操作系統,我也理解這一點,因爲從操作系統中分配內存是一個代價高昂的操作。

根本不是這樣。 Ruby語言並沒有說任何關於將內存釋放回操作系統的內容。事實上,Ruby語言並沒有提及任何有關內存的問題。

Ruby有很多不同的實現,有很多不同的內存分配器和很多不同的垃圾收集器。一些內存釋放回操作系統,一些不釋放,一些在受管運行時間之上運行,甚至根本不管理內存。

例如,在J9上運行的JRuby會將內存釋放回操作系統。使用G1 GC,ParallelScavenge GC或ParallelOld GC在HotSpot上運行的JRuby會將內存釋放回操作系統。

如果開發人員希望Ruby將內存從ruby釋放回操作系統,他們如何做到這一點。

你不知道。這個實現可以將內存釋放回操作系統,在這種情況下,您不需要執行任何操作,也不會將內存釋放回操作系統,在這種情況下您無法執行任何操作。

- 我想答案是在Ruby中手動觸發GC

如果實現沒有將內存釋放回操作系統,則它不會將內存釋放回操作系統。期。

如果執行確實將內存釋放回操作系統,那麼無論您是否手動觸發GC,它都會執行此操作。

順便說一下:你不能在Ruby中手動觸發GC。您可以建議 a GC(使用GC::start),但不能觸發它。

但是建議在生產應用程序上執行(運行手動GC)。

從來沒有。 GC比你知道現在或稍後運行是否合理。

注:我想我也知道GC.start(指停止整個世界紅寶石)

沒有,GC::start只建議做一個GC。它確實而不是強制GC。此外,GC並不意味着停止世界。例如。當在J9 JVM上使用節拍器GC運行JRuby或在Azul Zing JVM上使用Pauseless GC運行JRuby時從不會停止世界。

注:紅寶石版本2.2.2

這不是有趣的一點。有趣的問題是你正在使用哪個實現,哪個垃圾收集器以及哪個操作系統。 (當然,所有這些的版本和配置設置。)的

+0

米塔格多虧了迅速的回答的答案操作系統是基於Unix'Centos'後做精確。 Ruby是MRI Ruby。我將在問題中編輯它。 – Noobie

+0

W Mittang,這裏是我想要GC.start http://pastebin.com/rYdYwxLJ的原因。任何我現在理解的後果。 – Noobie

+0

在您的pastebin示例中,變量仍在範圍內。如果劃分腳本的上半部分中的方法,它可以讓可能的GC作爲變量超出範圍(無論是否已經分配'nil'它)。請參閱:https://stackoverflow.com/questions/14107398/is-it-common-to-set-objects-to-nil –