Интерфейс SegmentAllocator
- Все известные подинтерфейсы:
Arena
- Функциональный интерфейс:
- Это функциональный интерфейс, поэтому его можно использовать в качестве цели присваивания для лямбда-выражения или ссылки на метод.
@FunctionalInterface public interface SegmentAllocator
allocate(long, long). Аллокатор сегментов определяет несколько методов, которые могут быть полезны для создания сегментов из различных типов значений Java, таких как примитивы и массивы. SegmentAllocator — это функциональный интерфейс. Клиенты могут легко получить новый аллокатор сегментов с помощью лямбда-выражения или ссылки на метод:
SegmentAllocator autoAllocator = (byteSize, byteAlignment) -> Arena.ofAuto().allocate(byteSize, byteAlignment);
Этот интерфейс определяет фабричные методы для часто используемых аллокаторов:
-
slicingAllocator(MemorySegment)возвращает эффективный аллокатор с разбиением на срезы, который выделяет память, многократно создавая срезы предоставленного сегмента памяти; -
prefixAllocator(MemorySegment)возвращает аллокатор, который оборачивает сегмент и повторно использует его содержимое при каждом новом запросе на выделение памяти.
Передача аллокатора сегментов в API может быть особенно полезна в случаях, когда клиенту нужно указать, где следует хранить результаты определённой операции (выполняемой API) в виде сегмента памяти. Например, дескрипторы методов для вызовов во внешнюю функциюОГРАНИЧЕНО могут принимать дополнительный параметр SegmentAllocator, если известно, что лежащая в основе внешняя функция возвращает структуру по значению. Таким образом, параметр аллокатора указывает линкеру, где хранить возвращаемое значение внешней функции.
- Примечание к API:
- Если не указано иное, метод
allocate(long, long)не является потокобезопасным. Кроме того, сегменты памяти, выделенные аллокатором сегментов, могут иметь разные сроки жизни и даже быть связаны с перекрывающимися областями памяти. Поэтому клиентам, как правило, следует взаимодействовать только с аллокатором сегментов, которым они владеют.Вместо этого клиентам следует рассмотреть возможность использования арены, которая обеспечивает строгие гарантии потокобезопасности, срока жизни и отсутствия перекрытий.
- Начиная с версии:
- 22
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
default MemorySegment |
allocate |
Возвращает новый сегмент памяти с заданным byteSize. |
MemorySegment |
allocate |
Возвращает новый сегмент памяти с заданными byteSize и byteAlignment. |
default MemorySegment |
allocate |
Возвращает новый сегмент памяти с заданным описанием. |
default MemorySegment |
allocate |
Возвращает новый сегмент памяти с заданными elementLayout и count. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный адресом предоставленного сегмента памяти. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа byte. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива byte. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа char. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива char. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа double. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива double. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа float. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива float. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа int. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива int. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа long. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива long. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа short. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива short. |
default MemorySegment |
allocateFrom |
Возвращает новый сегмент памяти, инициализированный содержимым предоставленного сегмента. |
default MemorySegment |
allocateFrom |
Преобразует строку Java в C-строку с завершающим нулевым символом, используя кодировку UTF-8, и сохраняет результат в сегменте памяти. |
default MemorySegment |
allocateFrom |
Преобразует строку Java в C-строку с завершающим нулевым символом, используя предоставленную кодировку, и сохраняет результат в сегменте памяти. |
static SegmentAllocator |
prefixAllocator |
Возвращает аллокатор сегментов, который обрабатывает запросы на выделение памяти, повторно используя один сегмент. |
static SegmentAllocator |
slicingAllocator |
Возвращает аллокатор сегментов, который обрабатывает запросы на выделение памяти, возвращая последовательные срезы предоставленного сегмента. |
Подробное описание методов
allocateFrom
default MemorySegment allocateFrom(String str)
Вызов этого метода эквивалентен следующему коду:
allocateFrom(str, StandardCharsets.UTF_8);
- Параметры:
-
str— строка Java, которую нужно преобразовать в строку C - Возвращает:
- новый нативный сегмент, содержащий преобразованную строку C
allocateFrom
default MemorySegment allocateFrom(String str, Charset charset)
Этот метод всегда заменяет некорректные последовательности входных данных и последовательности символов, которые невозможно отобразить, стандартным массивом байтов-заменителей этой кодировки. Если требуется больший контроль над процессом кодирования, следует использовать класс CharsetEncoder.
Если заданная строка содержит символы '\0', они также будут скопированы. Это означает, что в зависимости от использованного метода чтения строки, например MemorySegment.getString(long), при повторном чтении строка будет выглядеть усечённой.
- Требования к реализации:
- Реализация этого метода по умолчанию копирует содержимое предоставленной строки Java в новый сегмент памяти, полученный вызовом
this.allocate(B + N), где:-
B— размер строки в байтах, закодированной с использованием предоставленной кодировки (например,str.getBytes(charset).length); -
N— размер (в байтах) символа-терминатора в соответствии с предоставленной кодировкой. Например, дляStandardCharsets.US_ASCIIон равен 1, а дляStandardCharsets.UTF_16— 2.
-
- Параметры:
-
str— строка Java, которую нужно преобразовать в строку C -
charset— кодировка, используемая для кодирования байтов строки - Возвращает:
- новый нативный сегмент, содержащий преобразованную строку C
- Вызывает:
-
IllegalArgumentException— еслиcharsetне является стандартной кодировкой
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfByte layout, byte value)
Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.
- Требования к реализации:
- Реализация по умолчанию эквивалентна следующему коду:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg; - Параметры:
-
layout— макет выделяемого блока памяти -
value— значение, которое будет установлено в новом сегменте памяти - Возвращает:
- новый сегмент памяти, инициализированный заданным значением byte
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfChar layout, char value)
Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.
- Требования к реализации:
- Реализация по умолчанию эквивалентна следующему коду:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg; - Параметры:
-
layout— макет выделяемого блока памяти -
value— значение, которое будет установлено в новом сегменте памяти - Возвращает:
- новый сегмент памяти, инициализированный заданным значением char
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfShort layout, short value)
Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.
- Требования к реализации:
- Реализация по умолчанию эквивалентна следующему коду:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg; - Параметры:
-
layout— макет выделяемого блока памяти -
value— значение, которое будет установлено в новом сегменте памяти - Возвращает:
- новый сегмент памяти, инициализированный заданным значением short
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfInt layout, int value)
Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.
- Требования к реализации:
- Реализация по умолчанию эквивалентна следующему коду:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg; - Параметры:
-
layout— макет выделяемого блока памяти -
value— значение, которое будет установлено в новом сегменте памяти - Возвращает:
- новый сегмент памяти, инициализированный заданным значением int
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfFloat layout, float value)
Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.
- Требования к реализации:
- Реализация по умолчанию эквивалентна следующему коду:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg; - Параметры:
-
layout— макет выделяемого блока памяти -
value— значение, которое будет установлено в новом сегменте памяти - Возвращает:
- новый сегмент памяти, инициализированный заданным значением float
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfLong layout, long value)
Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.
- Требования к реализации:
- Реализация по умолчанию эквивалентна следующему коду:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg; - Параметры:
-
layout— макет выделяемого блока памяти -
value— значение, которое будет установлено в новом сегменте памяти - Возвращает:
- новый сегмент памяти, инициализированный заданным значением long
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfDouble layout, double value)
Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.
- Требования к реализации:
- Реализация по умолчанию эквивалентна следующему коду:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg; - Параметры:
-
layout— макет выделяемого блока памяти -
value— значение, которое будет установлено в новом сегменте памяти - Возвращает:
- новый сегмент памяти, инициализированный заданным значением double
allocateFrom
default MemorySegment allocateFrom(AddressLayout layout, MemorySegment value)
Значение адреса может быть усечено в соответствии с размером адреса платформы (см. ValueLayout.ADDRESS).
Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.
- Требования к реализации:
- Реализация по умолчанию эквивалентна следующему коду:
Objects.requireNonNull(value); MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg; - Параметры:
-
layout— макет выделяемого блока памяти -
value— значение, которое будет установлено в новом сегменте памяти - Возвращает:
- новый сегмент памяти, инициализированный адресом предоставленного сегмента памяти
- Вызывает:
-
IllegalArgumentException— еслиvalueне является нативным сегментом
allocateFrom
default MemorySegment allocateFrom(ValueLayout elementLayout, MemorySegment source, ValueLayout sourceElementLayout, long sourceOffset, long elementCount)
Размер выделенного сегмента памяти равен elementLayout.byteSize() * elementCount. Содержимое исходного сегмента копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.
- Требования к реализации:
- Реализация этого метода по умолчанию эквивалентна следующему коду:
MemorySegment dest = this.allocate(elementLayout, elementCount); MemorySegment.copy(source, sourceElementLayout, sourceOffset, dest, elementLayout, 0, elementCount); return dest; - Параметры:
-
elementLayout— макет элементов выделяемого массива -
source— исходный сегмент -
sourceElementLayout— макет элементов исходного сегмента -
sourceOffset— начальное смещение исходного сегмента в байтах -
elementCount— количество элементов исходного сегмента для копирования - Возвращает:
- новый сегмент памяти, инициализированный содержимым предоставленного сегмента
- Вызывает:
-
IllegalArgumentException— еслиelementLayout.byteSize() != sourceElementLayout.byteSize() -
IllegalArgumentException— если исходный сегмент или смещение несовместимы с ограничением выравнивания в макете элементов источника -
IllegalArgumentException— еслиelementLayout.byteAlignment() > elementLayout.byteSize() -
IllegalArgumentException— еслиsourceElementLayout.byteAlignment() > sourceElementLayout.byteSize() -
IllegalStateException— если область действия, связанная сsource, не является активной -
WrongThreadException— если этот метод вызывается из потокаT, так чтоsource.isAccessibleBy(T) == false -
IllegalArgumentException— еслиelementCount * sourceElementLayout.byteSize()переполняется -
IllegalArgumentException— еслиelementCount < 0 -
IndexOutOfBoundsException— еслиsourceOffset > source.byteSize() - (elementCount * sourceElementLayout.byteSize()) -
IndexOutOfBoundsException— еслиsourceOffset < 0
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfByte elementLayout, byte... elements)
Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Содержимое исходного массива копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.
- Требования к реализации:
- Реализация этого метода по умолчанию эквивалентна следующему коду:
this.allocateFrom(layout, MemorySegment.ofArray(array), ValueLayout.JAVA_BYTE, 0, array.length) - Параметры:
-
elementLayout— макет элементов выделяемого массива -
elements— элементы byte, которые будут скопированы в новый блок памяти - Возвращает:
- новый сегмент памяти, инициализированный элементами предоставленного массива byte
- Вызывает:
-
IllegalArgumentException— еслиelementLayout.byteAlignment() > elementLayout.byteSize()
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfShort elementLayout, short... elements)
Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Элементы исходного массива копируются в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.
- Требования к реализации:
- Реализация этого метода по умолчанию эквивалентна следующему коду:
this.allocateFrom(layout, MemorySegment.ofArray(array), ValueLayout.JAVA_SHORT, 0, array.length) - Параметры:
-
elementLayout— макет элементов выделяемого массива -
elements— элементы short, которые будут скопированы в новый блок памяти - Возвращает:
- новый сегмент памяти, инициализированный элементами предоставленного массива short
- Вызывает:
-
IllegalArgumentException— еслиelementLayout.byteAlignment() > elementLayout.byteSize()
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfChar elementLayout, char... elements)
Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Содержимое исходного массива копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.
- Требования к реализации:
- Реализация этого метода по умолчанию эквивалентна следующему коду:
this.allocateFrom(layout, MemorySegment.ofArray(array), ValueLayout.JAVA_CHAR, 0, array.length) - Параметры:
-
elementLayout— макет элементов выделяемого массива -
elements— элементы char, которые будут скопированы в новый блок памяти - Возвращает:
- новый сегмент памяти, инициализированный элементами предоставленного массива char
- Вызывает:
-
IllegalArgumentException— еслиelementLayout.byteAlignment() > elementLayout.byteSize()
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfInt elementLayout, int... elements)
Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Содержимое исходного массива копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.
- Требования к реализации:
- Реализация этого метода по умолчанию эквивалентна следующему коду:
this.allocateFrom(layout, MemorySegment.ofArray(array), ValueLayout.JAVA_INT, 0, array.length) - Параметры:
-
elementLayout— макет элементов выделяемого массива -
elements— элементы int, которые будут скопированы в новый блок памяти - Возвращает:
- новый сегмент памяти, инициализированный элементами предоставленного массива int
- Вызывает:
-
IllegalArgumentException— еслиelementLayout.byteAlignment() > elementLayout.byteSize()
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfFloat elementLayout, float... elements)
Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Содержимое исходного массива копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.
- Требования к реализации:
- Реализация этого метода по умолчанию эквивалентна следующему коду:
this.allocateFrom(layout, MemorySegment.ofArray(array), ValueLayout.JAVA_FLOAT, 0, array.length) - Параметры:
-
elementLayout— макет элементов выделяемого массива -
elements— элементы float, которые будут скопированы в новый блок памяти - Возвращает:
- новый сегмент памяти, инициализированный элементами предоставленного массива float
- Вызывает:
-
IllegalArgumentException— еслиelementLayout.byteAlignment() > elementLayout.byteSize()
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfLong elementLayout, long... elements)
Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Содержимое исходного массива копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.
- Требования к реализации:
- Реализация этого метода по умолчанию эквивалентна следующему коду:
this.allocateFrom(layout, MemorySegment.ofArray(array), ValueLayout.JAVA_LONG, 0, array.length) - Параметры:
-
elementLayout— макет элементов выделяемого массива -
elements— элементы long, которые будут скопированы в новый блок памяти - Возвращает:
- новый сегмент памяти, инициализированный элементами предоставленного массива long
- Вызывает:
-
IllegalArgumentException— еслиelementLayout.byteAlignment() > elementLayout.byteSize()
allocateFrom
default MemorySegment allocateFrom(ValueLayout.OfDouble elementLayout, double... elements)
Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Содержимое исходного массива копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.
- Требования к реализации:
- Реализация этого метода по умолчанию эквивалентна следующему коду:
this.allocateFrom(layout, MemorySegment.ofArray(array), ValueLayout.JAVA_DOUBLE, 0, array.length) - Параметры:
-
elementLayout— макет элементов выделяемого массива -
elements— элементы double, которые будут скопированы в новый блок памяти - Возвращает:
- новый сегмент памяти, инициализированный элементами предоставленного массива double
- Вызывает:
-
IllegalArgumentException— еслиelementLayout.byteAlignment() > elementLayout.byteSize()
allocate
default MemorySegment allocate(MemoryLayout layout)
- Требования к реализации:
- Реализация этого метода по умолчанию вызывает
this.allocate(layout.byteSize(), layout.byteAlignment()). - Параметры:
-
layout— макет выделяемого блока памяти - Возвращает:
- новый сегмент памяти с заданным макетом
allocate
default MemorySegment allocate(MemoryLayout elementLayout, long count)
elementLayout и count.- Требования к реализации:
- Реализация этого метода по умолчанию вызывает
this.allocate(MemoryLayout.sequenceLayout(count, elementLayout)). - Параметры:
-
elementLayout— макет элемента массива -
count— количество элементов массива - Возвращает:
- новый сегмент памяти с заданными
elementLayoutиcount - Вызывает:
-
IllegalArgumentException— еслиelementLayout.byteSize() * countпереполняется -
IllegalArgumentException— еслиcount < 0
allocate
default MemorySegment allocate(long byteSize)
byteSize.- Требования к реализации:
- Реализация этого метода по умолчанию вызывает
this.allocate(byteSize, 1). - Параметры:
-
byteSize— размер (в байтах) выделяемого блока памяти - Возвращает:
- новый сегмент памяти с заданным
byteSize - Вызывает:
-
IllegalArgumentException— еслиbyteSize < 0
allocate
MemorySegment allocate(long byteSize, long byteAlignment)
byteSize и byteAlignment.- Параметры:
-
byteSize— размер (в байтах) выделяемого блока памяти -
byteAlignment— выравнивание (в байтах) выделяемого блока памяти - Возвращает:
- новый сегмент памяти с заданными
byteSizeиbyteAlignment - Вызывает:
-
IllegalArgumentException— еслиbyteSize < 0,byteAlignment <= 0или еслиbyteAlignmentне является степенью двойки
slicingAllocator
static SegmentAllocator slicingAllocator(MemorySegment segment)
Возвращённый аллокатор вызывает IndexOutOfBoundsException, если невозможно получить срез предоставленного сегмента с запрошенными размером и выравниванием.
- Примечание по реализации:
- Аллокатор срезов не является потокобезопасным.
- Параметры:
-
segment— сегмент, из которого должен создавать срезы возвращённый аллокатор - Возвращает:
- новый аллокатор срезов
- Вызывает:
-
IllegalArgumentException— еслиsegmentдоступен только для чтения
prefixAllocator
static SegmentAllocator prefixAllocator(MemorySegment segment)
0, отсюда и название префиксный аллокатор. Эквивалентен следующему коду (но, вероятно, работает эффективнее):
MemorySegment segment = ...
SegmentAllocator prefixAllocator = (size, align) -> segment.asSlice(0, size, align);
IndexOutOfBoundsException, если невозможно получить срез предоставленного сегмента с запрошенными размером и выравниванием.- Примечание API:
- Префиксный аллокатор может быть полезен для ограничения запросов на выделение, если клиент знает, что полностью обработал содержимое выделенного сегмента до следующего запроса на выделение.
- Примечание по реализации:
- Хотя префиксный аллокатор является потокобезопасным, при одновременном доступе к одному и тому же повторно используемому аллокатору поток может перезаписать содержимое базового сегмента, записанное другим потоком.
- Параметры:
-
segment— сегмент памяти, который будет повторно использоваться возвращённым аллокатором - Возвращает:
- аллокатор, повторно использующий существующий сегмент при каждом новом запросе на выделение
- Вызывает:
-
IllegalArgumentException— еслиsegmentдоступен только для чтения
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/foreign/SegmentAllocator.html