Spec-Zone.ru › OpenJDK 27

Интерфейс 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) в виде сегмента памяти. Например, дескрипторы методов downcallОГРАНИЧЕНО могут принимать дополнительный параметр SegmentAllocator, если известно, что нижележащая внешняя функция возвращает структуру по значению. По сути, параметр аллокатора сообщает компоновщику, где хранить возвращаемое значение внешней функции.

Примечание по API:
Если не указано иное, метод allocate(long, long) не является потокобезопасным. Кроме того, сегменты памяти, выделенные аллокатором сегментов, могут иметь разные сроки жизни и даже опираться на перекрывающиеся области памяти. По этим причинам клиентам, как правило, следует взаимодействовать только с принадлежащим им аллокатором сегментов.

Вместо этого клиентам следует рассмотреть возможность использования арены, которая обеспечивает строгие гарантии потокобезопасности, срока жизни и отсутствия перекрытий.

Начиная с версии:
22

Краткое описание методов

Модификатор и тип Метод Описание
default MemorySegment allocate(long byteSize)
Возвращает новый сегмент памяти с указанным byteSize.
MemorySegment allocate(long byteSize, long byteAlignment)
Возвращает новый сегмент памяти с указанными byteSize и byteAlignment.
default MemorySegment allocate(MemoryLayout layout)
Возвращает новый сегмент памяти с указанным макетом.
default MemorySegment allocate(MemoryLayout elementLayout, long count)
Возвращает новый сегмент памяти с указанными elementLayout и count.
default MemorySegment allocateFrom(AddressLayout layout, MemorySegment value)
Возвращает новый сегмент памяти, инициализированный адресом предоставленного сегмента памяти.
default MemorySegment allocateFrom(ValueLayout.OfByte layout, byte value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением byte.
default MemorySegment allocateFrom(ValueLayout.OfByte elementLayout, byte... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива byte.
default MemorySegment allocateFrom(ValueLayout.OfChar layout, char value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением char.
default MemorySegment allocateFrom(ValueLayout.OfChar elementLayout, char... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива char.
default MemorySegment allocateFrom(ValueLayout.OfDouble layout, double value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением double.
default MemorySegment allocateFrom(ValueLayout.OfDouble elementLayout, double... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива double.
default MemorySegment allocateFrom(ValueLayout.OfFloat layout, float value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением float.
default MemorySegment allocateFrom(ValueLayout.OfFloat elementLayout, float... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива float.
default MemorySegment allocateFrom(ValueLayout.OfInt layout, int value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением int.
default MemorySegment allocateFrom(ValueLayout.OfInt elementLayout, int... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива int.
default MemorySegment allocateFrom(ValueLayout.OfLong layout, long value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением long.
default MemorySegment allocateFrom(ValueLayout.OfLong elementLayout, long... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива long.
default MemorySegment allocateFrom(ValueLayout.OfShort layout, short value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением short.
default MemorySegment allocateFrom(ValueLayout.OfShort elementLayout, short... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива short.
default MemorySegment allocateFrom(ValueLayout elementLayout, MemorySegment source, ValueLayout sourceElementLayout, long sourceOffset, long elementCount)
Возвращает новый сегмент памяти, инициализированный содержимым предоставленного сегмента.
default MemorySegment allocateFrom(String str)
Преобразует строку Java в строку C с завершающим нулевым символом с помощью кодировки UTF-8, сохраняя результат в сегменте памяти.
default MemorySegment allocateFrom(String str, Charset charset)
Преобразует строку Java в строку C с завершающим нулевым символом с помощью предоставленной кодировки и сохраняет результат в сегменте памяти.
default MemorySegment allocateFrom(String str, Charset charset, int srcIndex, int numChars)
Кодирует строку Java с помощью предоставленной кодировки и сохраняет полученный массив byte в сегменте памяти.
static SegmentAllocator prefixAllocator(MemorySegment segment)
Возвращает аллокатор сегментов, который обрабатывает запросы на выделение памяти, повторно используя один сегмент.
static SegmentAllocator slicingAllocator(MemorySegment segment)
Возвращает аллокатор сегментов, который обрабатывает запросы на выделение памяти, возвращая последовательные срезы, полученные из предоставленного сегмента.

Подробное описание методов

allocateFrom

default MemorySegment allocateFrom(String str)
Преобразует строку Java в строку C с нулевым терминатором, используя кодировку UTF-8, и сохраняет результат в сегменте памяти.

Вызов этого метода эквивалентен следующему коду:

 allocateFrom(str, StandardCharsets.UTF_8);
Параметры:
str — строка Java, которую требуется преобразовать в строку C
Возвращает:
новый нативный сегмент, содержащий преобразованную строку C

allocateFrom

default MemorySegment allocateFrom(String str, Charset charset)
Преобразует строку Java в строку C с нулевым терминатором, используя указанную кодировку, и сохраняет результат в сегменте памяти.

Этот метод всегда заменяет некорректные входные последовательности и последовательности символов, не поддающихся отображению, массивом байтов замены по умолчанию для этой кодировки. Если требуется больший контроль над процессом кодирования, следует использовать класс CharsetEncoder.

Если заданная строка содержит символы '\0', они также будут скопированы. Это означает, что в зависимости от метода чтения строки, например MemorySegment.getString(long), при повторном чтении строка будет усечена. Строку можно прочитать без усечения с помощью MemorySegment.getString(long, Charset, long).

Требования к реализации:
Реализация этого метода по умолчанию копирует содержимое указанной строки Java в новый сегмент памяти, полученный вызовом this.allocate(B + N), где:
  • B — размер строки в байтах при кодировании указанной кодировкой (например, str.getBytes(charset).length);
  • N — размер (в байтах) символа-терминатора в указанной кодировке. Например, он равен 1 для StandardCharsets.US_ASCII и 2 для StandardCharsets.UTF_16.
Параметры:
str — строка Java, которую требуется преобразовать в строку C
charset — кодировка, используемая для кодирования байтов строки
Возвращает:
новый нативный сегмент, содержащий преобразованную строку C
Выбрасывает:
IllegalArgumentException — если charset не является стандартной кодировкой

allocateFrom

default MemorySegment allocateFrom(String str, Charset charset, int srcIndex, int numChars)
Кодирует строку Java с использованием указанной кодировки и сохраняет полученный массив байтов в сегменте памяти.

Этот метод всегда заменяет некорректные входные последовательности и последовательности символов, не поддающихся отображению, массивом байтов замены по умолчанию для этой кодировки. Если требуется больший контроль над процессом кодирования, следует использовать класс CharsetEncoder.

Если заданная строка содержит символы '\0', они также будут скопированы. Это означает, что в зависимости от метода чтения строки, например MemorySegment.getString(long), при повторном чтении строка будет усечена. Строку можно прочитать без усечения с помощью MemorySegment.getString(long, Charset, long).

Требования к реализации:
Реализация этого метода по умолчанию копирует содержимое указанной строки Java в новый сегмент памяти, полученный вызовом this.allocate(B), где B — размер строки в байтах при кодировании указанной кодировкой (например, str.getBytes(charset).length);
Параметры:
str — строка Java, которую требуется закодировать
charset — кодировка, используемая для кодирования байтов строки
srcIndex — начальный индекс исходной строки
numChars — количество копируемых символов
Возвращает:
новый нативный сегмент, содержащий закодированную строку
Выбрасывает:
IndexOutOfBoundsException — если srcIndex или numChars имеют значение < 0
IndexOutOfBoundsException — если srcIndex > str.length() - numChars
Начиная с:
27

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfByte layout, byte value)
Возвращает новый сегмент памяти, инициализированный заданным значением byte.

Размер выделенного сегмента памяти равен размеру заданного макета. Заданное значение записывается в сегмент с учетом порядка байтов и ограничения выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 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)
Возвращает новый сегмент памяти, инициализированный заданным значением char.

Размер выделенного сегмента памяти равен размеру заданного макета. Заданное значение записывается в сегмент с учетом порядка байтов и ограничения выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 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)
Возвращает новый сегмент памяти, инициализированный заданным значением short.

Размер выделенного сегмента памяти равен размеру заданного макета. Заданное значение записывается в сегмент с учетом порядка байтов и ограничения выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 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)
Возвращает новый сегмент памяти, инициализированный заданным значением int.

Размер выделенного сегмента памяти равен размеру заданного макета. Заданное значение записывается в сегмент с учетом порядка байтов и ограничения выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 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)
Возвращает новый сегмент памяти, инициализированный заданным значением float.

Размер выделенного сегмента памяти равен размеру заданного макета. Заданное значение записывается в сегмент с учетом порядка байтов и ограничения выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 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)
Возвращает новый сегмент памяти, инициализированный заданным значением long.

Размер выделенного сегмента памяти равен размеру заданного макета. Заданное значение записывается в сегмент с учетом порядка байтов и ограничения выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 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)
Возвращает новый сегмент памяти, инициализированный заданным значением double.

Размер выделенного сегмента памяти равен размеру заданного макета. Заданное значение записывается в сегмент с учетом порядка байтов и ограничения выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 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)
Возвращает новый сегмент памяти, инициализированный элементами указанного массива byte.

Размер выделенного сегмента памяти равен 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)
Возвращает новый сегмент памяти, инициализированный элементами указанного массива short.

Размер выделенного сегмента памяти равен 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)
Возвращает новый сегмент памяти, инициализированный элементами указанного массива char.

Размер выделенного сегмента памяти равен 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)
Возвращает новый сегмент памяти, инициализированный элементами указанного массива int.

Размер выделенного сегмента памяти равен 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)
Возвращает новый сегмент памяти, инициализированный элементами указанного массива float.

Размер выделенного сегмента памяти равен 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)
Возвращает новый сегмент памяти, инициализированный элементами указанного массива long.

Размер выделенного сегмента памяти равен 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)
Возвращает новый сегмент памяти, инициализированный элементами указанного массива double.

Размер выделенного сегмента памяти равен 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 доступен только для чтения

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторские права © 1993, 2026, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API