Можно ли копировать из собственной памяти в ByteBuffer с помощью нового API FFM без создания временных объектов?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Можно ли копировать из собственной памяти в ByteBuffer с помощью нового API FFM без создания временных объектов?

Сообщение Anonymous »

У нас есть проект с открытым исходным кодом, использующий sun.misc.Unsafe, который мы переносим на новый API внешних функций и памяти (FFM). Для нашего конкретного варианта использования (торговые системы с низкой задержкой) важно не создавать никакого мусора (временно отброшенных экземпляров) при получении сообщения, поскольку эти системы обрабатывают сотни тысяч сообщений в секунду.
Мы столкнулись с проблемой при копировании из собственной памяти прямо в 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()) { //

Подробнее здесь: https://stackoverflow.com/questions/793 ... ew-ffm-api
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»