通过/dev/shm执行Java IPC的正确方式是什么(具有尽可能低的延迟) [英] What is the correct way of doing Java IPC through /dev/shm (with the lowest possible latency)

查看:1
本文介绍了通过/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的正确方式是什么(具有尽可能低的延迟)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆