У нас есть проект с открытым исходным кодом, использующий 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
Можно ли копировать из собственной памяти в ByteBuffer с помощью нового API FFM без создания временных объектов? ⇐ JAVA
Программисты JAVA общаются здесь
1735289766
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()) { //
Подробнее здесь: [url]https://stackoverflow.com/questions/79311345/is-it-possible-to-copy-from-native-memory-to-a-bytebuffer-using-the-new-ffm-api[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия