Мы столкнулись с проблемой при копировании из собственной памяти прямо в ByteBuffer с использованием API FFM.
Использование sun.misc.Unsafe, копирование из памяти в ByteBuffer может быть сделано без создания временных объектов и накладных расходов сборщика мусора. Однако с помощью FFM API добиться того же в настоящее время не представляется возможным без генерации мусора посредством вызова MemorySegment.ofBuffer.
Есть ли способ сделать это с помощью FFM API, о котором мы не знаем?
Ниже текущего кода у нас есть sun.misc.Unsafe, который не создает никакого мусора и единственный известный нам способ сделать это с FFM API, который выдаёт мусор.
Код: Выделить всё
// 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);
}
}
Код: Выделить всё
// 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()) { //
Подробнее здесь: [url]https://stackoverflow.com/questions/79311345/is-it-possible-to-copy-from-native-memory-to-a-bytebuffer-using-the-new-ffm-api[/url]
Мобильная версия