[英]better Java IPC@Linux tactic: (a) java.nio File API on /dev/shm or (b) JNI to shmctl(2)?
[英]What is the correct way of doing Java IPC through /dev/shm (with the lowest possible latency)
我正在嘗試通過/dev/shm
編寫 IPC 解決方案。
@SK-logic 在這里的評論中給了我一些指示: 編年史:如何優化內存映射文件以實現低延遲?
我的疑問是:我應該使用MappedByteBuffer
還是只使用普通的FileChannel
?
借助MappedByteBuffer
,我可以使用sun.misc.Unsafe
並直接訪問 memory。這太棒了,因為Unsafe
為我提供了getLongVolatile
(除getLong
之外)和putLongVolatile
(除putLong
)等方法。 如果我使用普通的FileChannel
甚至有可能嗎? 我如何避免使用從/dev/shm/
讀取的普通FileChannel
從 CPU 緩存讀取緩存數據? 我是否必須在操作系統中配置某些內容以從/dev/shm
進行易失性讀取和寫入? 什么? 在哪里? 如何? :)
通過/dev/shm
進行 Java IPC 的正確方法是什么? 普通文件通道? 映射字節緩沖區?
下面是我如何通過sun.misc.Unsafe
獲取指向 memory 的指針:
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);
}
Chronicle Queue 使用Unsafe
進行線程安全 memory 訪問堆和直接 memory。
雖然這有效,但 JVM 不對您的系統的行為方式提供任何保證。 我們在 Intel X64、AMD 和 ARM 處理器上進行測試。
與其自己編寫所有這些,不如試試 Chronicle Map 或 Queue 來為您完成這些工作?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.