本文介紹了通過/dev/shm執(zhí)行Java IPC的正確方式是什么(具有盡可能低的延遲)的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我正在嘗試通過/dev/shm
編寫IPC解決方案。
@SK-logic在這里的評(píng)論中給了我一些指示:Chronicle: How to optimize memory-mapped files for low-latency?
我的疑問是:我應(yīng)該使用MappedByteBuffer
還是只使用普通的FileChannel
?
通過MappedByteBuffer
,我可以使用sun.misc.Unsafe
并可以直接訪問內(nèi)存。這很棒,因?yàn)?code>Unsafe提供了像getLongVolatile
(除了getLong
)和putLongVolatile
(除了putLong
)這樣的方法。如果我使用普通的FileChannel
,這可能嗎?如何避免從FileChannel
讀取FileChannel
從CPU緩存中讀取緩存數(shù)據(jù)?對(duì)于/dev/shm
中的易失性讀寫,我是否必須在操作系統(tǒng)中配置某些內(nèi)容?什么?哪里?如何?:)
通過/dev/shm
執(zhí)行Java IPC的正確方式是什么?普通文件頻道?MappdByteBuffer?
下面我如何通過sun.misc.Unsafe
獲取指向內(nèi)存的指針:
try {
this.raf = new RandomAccessFile(file, "rw");
this.fileChannel = raf.getChannel();
this.mappedBuffer = this.fileChannel.map(MapMode.READ_WRITE, 0, size);
} catch (Exception e) {
throw new RuntimeException("Could not mmap file to memory: " + filename + " " + size, e);
}
try {
addressField = Buffer.class.getDeclaredField("address");
addressField.setAccessible(true);
this.pointer = (long) addressField.get(this.mappedBuffer);
} catch(Exception e) {
throw new RuntimeException("Could not get off-heap pointer!", e);
}
推薦答案
歷史記錄隊(duì)列使用Unsafe
對(duì)堆和直接內(nèi)存進(jìn)行線程安全內(nèi)存訪問。
雖然這是可行的,但JVM并不保證系統(tǒng)將如何運(yùn)行。我們?cè)贗ntel X64、AMD和ARM處理器上進(jìn)行測(cè)試。
與其自己編寫所有這些內(nèi)容,為什么不嘗試使用編年史地圖或隊(duì)列來為您完成這些工作呢?
這篇關(guān)于通過/dev/shm執(zhí)行Java IPC的正確方式是什么(具有盡可能低的延遲)的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,