首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过/dev/shm执行Java的正确方法是什么(以尽可能低的延迟)

通过/dev/shm执行Java的正确方法是什么(以尽可能低的延迟)
EN

Stack Overflow用户
提问于 2022-02-10 03:52:59
回答 1查看 226关注 0票数 1

我正在尝试通过/dev/shm编写一个IPC解决方案。

@SK-逻辑在评论中给了我一些提示:Chronicle: How to optimize memory-mapped files for low-latency?

我的疑问是:是使用MappedByteBuffer还是普通的FileChannel

使用MappedByteBuffer,我可以使用sun.misc.Unsafe并直接访问内存。这太棒了,因为Unsafe给了我一些方法,比如getLongVolatile (除了getLong)和putLongVolatile (除了putLong)。如果我使用普通的FileChannel,这可能吗?如何避免使用普通FileChannel/dev/shm/读取缓存的数据?我是否必须在操作系统中为/dev/shm中的易失性读写进行配置?什么?哪里?如何?:)

通过Java通过/dev/shm**?进行的正确方法是什么?普通的FileChannel?马斯普德·拜特·巴弗?**

下面是如何通过sun.misc.Unsafe获取指向内存的指针

代码语言:javascript
复制
    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);
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-10 10:18:51

纪事队列使用Unsafe进行线程安全内存访问、堆访问和直接内存访问。

虽然这是可行的,但JVM并没有为您的系统的行为提供任何保证。我们测试英特尔的X64,AMD,和ARM处理器。

与其自己写这些东西,不如试试“纪事地图”或“队列”来帮你做到这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71059608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档