2014-07-22 36 views
3

我正在學習Elixir,並希望確定我理解垃圾收集在Erlang虛擬機中是如何工作的。BEAM(Erlang VM)並行執行垃圾回收嗎?

我的理解是這樣的:

  • 每個VM級進程都有自己的堆
  • 如果這堆沒有填滿它終止之前,它與過程丟棄,需要
  • 沒有GC
  • 堆那些填滿的垃圾分別回收,並行,所以GC不會「阻止世界」,只是一個過程

這是正確的嗎?

+1

您是否已經閱讀過此文件:http://prog21.dadgum.com/16.html – Berzemus

+0

是的,這是正確的。 –

+0

是的,每個進程都有自己的垃圾回收。 –

回答

10

進行垃圾回收。當需要收集其他 語言的垃圾時,整個系統必須停止運行垃圾收集器 。如果您的計算機程序 應該運行一次,寫入一些輸出,然後退出,則此方法非常好。但在 長時間運行的應用程序(如桌面,移動設備或服務器 )中,此策略會導致偶爾凍結的用戶界面和緩慢的響應時間。另一方面,Erlang程序可以擁有數千個獨立堆,這些堆是分別垃圾收集的;在這個 的方式中,垃圾收集的性能損失分散在 以上,所以長時間運行的應用程序不會神祕地停止 在垃圾收集器運行時不時響應。

Evan Miller, creator of the popular Chicago Boss framework.

所以我相信二郎山垃圾收集的同時,也就是不同的堆是收集彼此獨立的垃圾。是否有任何並行化取決於您的節點是否在多核心上運行,但如果是這樣,那麼垃圾收集是並行完成的,是的。

+0

他沒有說其他語言沒有併發垃圾收集。 –

+0

... *用其他語言*;這是否意味着一個,很多,所有?無論如何,我不認爲這是語言特定的。垃圾收集已經隨着時間的推移而發展,並且仍然會在未來發展。重要的一點是Erlang GC支持併發GC,它可以回答這個問題。 –

+0

啊,我陷入了困境。在這種情況下,他正在爲有經驗的程序員寫信,所以他們可能會知道虛擬機和語言功能幾乎不是唯一的。他只是強調了一個在流行替代品中不太常見的erlang特性,並且可能經過了更多的戰鬥測試 - 更多的是可能性而不是絕對的。 –