Ist es möglich, mit der neuen FFM-API vom nativen Speicher in einen ByteBuffer zu kopieren, ohne temporäre Objekte zu erJava

Java-Forum
Guest
 Ist es möglich, mit der neuen FFM-API vom nativen Speicher in einen ByteBuffer zu kopieren, ohne temporäre Objekte zu er

Post by Guest »

Wir haben ein Open-Source-Projekt mit sun.misc.Unsafe, das wir auf die neue Foreign Function & Memory (FFM) API migrieren. Für unseren speziellen Anwendungsfall (Handelssysteme mit geringer Latenz) ist es wichtig, beim Empfang einer Nachricht keinen Müll (vorübergehend verworfene Instanzen) zu erzeugen, da diese Systeme Hunderttausende Nachrichten pro Sekunde verarbeiten.
Beim Kopieren aus dem nativen Speicher direkt in einen direkten ByteBuffer mithilfe der FFM-API ist ein Problem aufgetreten.
Verwendung von sun.misc.Unsafe beim Kopieren aus dem Speicher in einen ByteBuffer kann durchgeführt werden ohne temporäre Objekte und Garbage-Collector-Overhead zu erstellen. Allerdings scheint es mit der FFM-API derzeit nicht möglich zu sein, dasselbe zu erreichen, ohne über einen Aufruf von MemorySegment.ofBuffer Müll zu erzeugen.
Gibt es derzeit eine Möglichkeit, dies zu tun? FFM-API, die uns nicht bekannt ist?
Unten der aktuelle Code, den wir mit sun.misc.Unsafe haben, der keinen Müll produziert und die einzige Möglichkeit ist, die uns bekannt ist es mit der FFM-API zu tun, die produziert Müll.

Code: Select all

// With sun.misc.Unsafe:
@Override
public void getByteBuffer(long address, ByteBuffer dst, int len) {
if (!dst.isDirect()) {
throw new RuntimeException("getByteBuffer can only take a direct byte buffer!");
}
try {
long dstAddress = (long) addressField.get(dst); // get the memory address of this ByteBuffer
dstAddress += dst.position(); // adjust the address for the ByteBuffer current position

unsafe.copyMemory(address, dstAddress, len); // copy without temp objects

dst.position(dst.position() + len); // adjust the ByteBuffer position to reflect the copy operation
} catch(Exception e) {
throw new RuntimeException(e);
}
}

Code: Select all

// With FFM API:
@Override
public void getByteBuffer(long address, ByteBuffer dst, int len) {
if (!dst.isDirect()) {
throw new RuntimeException("getByteBuffer can only take a direct byte buffer!");
}

long offset = address - this.address; // offset in our 'segment'

try (Arena arena = Arena.ofConfined()) { //

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post