What is the correct way of doing Java IPC through /dev/shm (with the lowest possible latency)(通过/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
对堆和直接内存进行线程安全内存访问。
与其自己编写所有这些内容,为什么不尝试使用编年史地图或队列来为您完成这些工作呢?
这篇关于通过/dev/shm执行Java IPC的正确方式是什么(具有尽可能低的延迟)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:通过/dev/shm执行Java IPC的正确方式是什么(具有尽可能低的延迟)
基础教程推荐
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01