本文介紹了通過/dev/shm執行Java IPC的正確方式是什么(具有盡可能低的延遲)的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在嘗試通過/dev/shm
編寫IPC解決方案。
@SK-logic在這里的評論中給了我一些指示:Chronicle: How to optimize memory-mapped files for low-latency?
我的疑問是:我應該使用MappedByteBuffer
還是只使用普通的FileChannel
?
通過MappedByteBuffer
,我可以使用sun.misc.Unsafe
并可以直接訪問內存。這很棒,因為Unsafe
提供了像getLongVolatile
(除了getLong
)和putLongVolatile
(除了putLong
)這樣的方法。如果我使用普通的FileChannel
,這可能嗎?如何避免從FileChannel
讀取FileChannel
從CPU緩存中讀取緩存數據?對于/dev/shm
中的易失性讀寫,我是否必須在操作系統中配置某些內容?什么?哪里?如何?:)
通過/dev/shm
執行Java IPC的正確方式是什么?普通文件頻道?MappdByteBuffer?
下面我如何通過sun.misc.Unsafe
獲取指向內存的指針:
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);
}
推薦答案
歷史記錄隊列使用Unsafe
對堆和直接內存進行線程安全內存訪問。
雖然這是可行的,但JVM并不保證系統將如何運行。我們在Intel X64、AMD和ARM處理器上進行測試。
與其自己編寫所有這些內容,為什么不嘗試使用編年史地圖或隊列來為您完成這些工作呢?
這篇關于通過/dev/shm執行Java IPC的正確方式是什么(具有盡可能低的延遲)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,