5

Jikes RVM是一個metacircular java運行庫,似乎有用Java編寫的Allocator/Collector(MMTK)。使用託管語言編寫內存管理器?

它是如何工作的,那麼,當你的垃圾收集器需要一個垃圾收集器來運行?從代碼看,我沒有看到MMTK將自己限制爲任何特定的Java子集,但是在我看來,如果您的代碼是要分配託管內存需要分配託管內存來運行,它會進入遞歸旋轉直到爆炸。

但很明顯,MMTK的作品,顯然其他一些項目也在使用它。如何使用Java等託管語言編寫內存分配器和GC?

+0

真正的答案在於源代碼...所以獲取Jikes的源代碼並在其中搜索 – 2013-04-06 05:46:20

+3

我已經做到了。這是一個巨大的項目,我沒有找到任何具體的啓示。這就像回答「JVM如何工作」與「去下載HotSpot存儲庫並開始尋找!」 – 2013-04-06 05:56:12

+0

我聽說過MMTK,基本上它是一個程序生成器。你也可以閱讀他們的論文,並向作者詢問...... – 2013-04-06 05:57:26

回答

1

這裏有很多實例。我對Jikes的實現並不熟悉,但我確實閱讀了基於Java的設計和PyPy。他們大多數的共同點是將事物分爲兩個層次:運行時/解釋器級別和應用程序級別。每個級別都有自己的對象,例外,執行流程等。

當你抽象地思考它時,它實際上更容易理解。運行時層可能已被寫入內存管理與否,低級別或高級別,命令式或功能性。這並不重要。重要的是它的功能,它的功能。它最終被翻譯成機器代碼,所有機器代碼都與機器相同。該代碼將操作碼和數據作爲輸入,基於此操作執行預定義操作,管理資源等。

應用程序層包含在這些操作碼中。應用程序層代表另一個接受輸入,處理它並執行輸出的整體函數。這些步驟可能還會內置一個內存管理例程。運行時並不關心操作碼在做什麼,只要它們有效並且只是執行它們。從理論上講,您可以編寫包含GC語言的GC語言,其中包含GC語言......等等直到您達到ENIAC速度。 ;)

我想說像傑克斯這樣的設計的差異化是他們的效率(有時是靈活性)。用GC語言編寫GC,解釋器或運行庫是不夠的。結果必須可用,這通常意味着速度。可能還需要有條款來處理應用程序層的本地代碼集成。大部分真正的工作都會進入這些東西。只要在GC語言中運行GC是一件非常簡單的事情:這基本上就是在不同的抽象層次上標記和管理對象。

注意:如果您對GC語言和基於GC的運行時間進行了編碼簽名,則可以利用此優點提高性能和簡化性能。例如,您可以使用兩個完整的垃圾收集器(一個在另一個之上)運行,而在頂部使用一個較薄的GC可以在底部安裝一個更智能的GC。更智能的GC知道運行時間和應用程序級別之間的差異,確保分別對它們進行操作,而不是進行不適當的混合。薄頂GC基本上只是通過主GC理解的方式對主GC或標籤對象進行過程調用,但這不會增加大量開銷。

事情有關這些類型的項目是每一個有點不同。目標和實現語言的性質決定了設計選擇。給你足夠的機會去創造你解決問題的方式。

0

你想要哪個答案:
- 「這只是一個引導過程,有什麼大不了的?」

- !「這是神奇的(也就是說,一個技術比目前一個領會更先進。)」

第一Ç編譯器被寫了,得到這個,Ç。第一操作系統是如何寫的?爲了一個誰花了一個下午labouriously創建紙帶引導一tedious-一個接一個地使用切換開關和控制檯燈(在18位DEC PDP-15上)的,這些都不是什麼神祕的東西,一開始就是最先進的作品,可以重複使用,直到工具包足以構建應用程序爲止

+2

我正在尋找更具體的問題。我知道如何編寫自承載編譯器,並且我熟悉了自舉過程。但是,我不知道bootstrapping在像垃圾回收器這樣有運行時依賴的情況下如何工作,這與編譯器的編譯時間依賴非常不同。 – 2013-04-22 16:45:57