簡體   English   中英

通過 /dev/shm 執行 Java IPC 的正確方法是什么(盡可能低的延遲)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM