2014-10-01 76 views
1

ChronicleMap上OpenHFT的repository on Github狀態的文檔中:ChronicleMap(和更通用的堆外數據結構)實現?

Chronicle Map implements the java.util.concurrent.ConcurrentMap, that stores 
    its data off the java heap. 

我已經建立了一個編譯器和促成了一些旁枝語言編譯器實現。我一直在分配堆棧中的所有內容(這是代碼生成期間可用的內容)。我從來沒有在JVM和java編譯器上工作過,但我知道通常只有堆和棧可用於分配類,局部變量,函數參數等實例。

有人能解釋我們能夠編寫代碼,我們可以告訴編譯器實例化ChronicalMap等數據結構,讓它們可供JVM進行垃圾回收(並且可以通過JVM的通用內存管理功能進行跟蹤)堆?我已閱讀simple construction documentation and the associate example。我看到了how,但與JVM結合究竟發生了什麼的推理尚不清楚。

+1

很少有Java開發人員知道你可以用這種堆外堆棧,更不用說如何使用它來編寫代碼,這就是爲什麼有庫要隱藏這些細節。 – 2014-10-01 18:15:16

回答

3

要記住一個重要的事情是javac編譯器在優化方式上沒有太多的工作,也沒有給出任何指定數據存儲位置或代碼應該如何優化的方法。 (在Java 8中有一些模糊的例外,例如@Contended)

Java從運行時通常運行的庫中衍生出很多可擴展性。 (通常還有構建時間選項)要實現的關鍵是Java程序可以在運行時生成和更改代碼,因此實際上很多智能都是在運行時發生的。

在堆外使用情況下,您需要一個支持此功能的庫,這將直接或間接使用sun.misc.Unsafe(在最流行的JVM上)此類允許您執行許多語言不支持的操作,但如果您是低級別的庫構建器,則仍然非常有用。

儘管關閉堆內存不是由GC直接管理的,但您可以使用代理對象,例如ByteBuffer其中有一個Cleaner,這樣當這些對象進行GC編輯時,與其關聯的堆堆內存也會被清除。

免責聲明我寫了大部分ChronicleMap。

+1

彼得,謝謝你的回答,並深入研究ChronicleMap,我會研究'sun.miscm.Unsafe'和'Cleaner',並且更多地閱讀它們。同時我也是S.O.許多答案的忠實粉絲,謝謝! (小世界看你如何寫ChronicleMap,沒有看到這個!哈哈)希望你有一個偉大的一週! – 2014-10-01 18:19:12

+1

@DevarshDesai我的公司是http://openhft.net/about-company/我需要一張新照片;) – 2014-10-01 18:20:52

1

術語off堆是指在java中使用「原始」內存緩衝區的能力。這些可能來自進程地址空間的常規內存緩衝區或內存映射文件。

這些緩衝區是「原始的」 - 您自己管理它們的內容 - 它們不受垃圾收集器管理。

+0

謝謝你的一點洞察力,感謝你的時間,Ophir! – 2014-10-01 18:19:49