Интерфейс SegmentAllocator
- Все известные подинтерфейсы:
ArenaPREVIEW
- Функциональный интерфейс:
- Это функциональный интерфейс и поэтому может быть использован в качестве цели присваивания лямбда-выражения или ссылки на метод.
@FunctionalInterface public interface SegmentAllocator
SegmentAllocator является предварительным API платформы Java. 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)не потокобезопасен. Кроме того, сегменты памяти, выделенные сегментным распределятелем, могут быть связаны с различными жизненными циклами и даже могут опираться на перекрывающиеся области памяти. По этим причинам клиенты, как правило, должны взаимодействовать только с сегментным распределятелем, которым они владеют.Клиенты должны рассмотреть использование ареныPREVIEW вместо этого, которая обеспечивает сильную потокобезопасность, гарантии жизненного цикла и неперекрывающихся областей памяти.
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
default MemorySegmentPREVIEW |
allocate |
Выделяет сегмент памяти заданного размера. |
MemorySegmentPREVIEW |
allocate |
Выделяет сегмент памяти заданного размера и ограничения выравнивания. |
default MemorySegmentPREVIEW |
allocate |
Выделяет сегмент памяти с заданной структурой и инициализирует его значением заданного адреса. |
default MemorySegmentPREVIEW |
allocate |
Выделяет сегмент памяти с заданной структурой. |
default MemorySegmentPREVIEW |
allocate |
Выделяет сегмент памяти с заданной структурой и инициализирует его значением заданного байта. |
default MemorySegmentPREVIEW |
allocate |
Выделяет сегмент памяти с заданной структурой и инициализирует его значением заданного символа. |
default MemorySegmentPREVIEW |
allocate |
Выделяет сегмент памяти с заданной структурой и инициализирует его значением заданного двойного значения. |
default MemorySegmentPREVIEW |
allocate |
Выделяет сегмент памяти с заданной структурой и инициализирует его значением заданного плавающего значения. |
default MemorySegmentPREVIEW |
allocate |
Выделяет сегмент памяти с заданной структурой и инициализирует его значением заданного целого числа. |
default MemorySegmentPREVIEW |
allocate |
Выделяет сегмент памяти с заданной структурой и инициализирует его значением заданного длинного целого числа. |
default MemorySegmentPREVIEW |
allocate |
Выделяет сегмент памяти с заданной структурой и инициализирует его значением заданного короткого целого числа. |
default MemorySegmentPREVIEW |
allocateArray |
Выделяет сегмент памяти с заданной структурой элемента и размером. |
default MemorySegmentPREVIEW |
allocateArray |
Выделяет сегмент памяти с заданной структурой и инициализирует его заданными байтовыми элементами. |
default MemorySegmentPREVIEW |
allocateArray |
Выделяет сегмент памяти с заданной структурой и инициализирует его заданными символами. |
default MemorySegmentPREVIEW |
allocateArray |
Выделяет сегмент памяти с заданной структурой и инициализирует его заданными двойными элементами. |
default MemorySegmentPREVIEW |
allocateArray |
Выделяет сегмент памяти с заданной структурой и инициализирует его заданными плавающими элементами. |
default MemorySegmentPREVIEW |
allocateArray |
Выделяет сегмент памяти с заданной структурой и инициализирует его заданными целыми элементами. |
default MemorySegmentPREVIEW |
allocateArray |
Выделяет сегмент памяти с заданной структурой и инициализирует его заданными длинными элементами. |
default MemorySegmentPREVIEW |
allocateArray |
Выделяет сегмент памяти с заданной структурой и инициализирует его заданными короткими элементами. |
default MemorySegmentPREVIEW |
allocateUtf8String |
Преобразует строку Java в UTF-8 кодированную, завершающуюся нулём строку C, сохраняя результат в сегменте памяти. |
static SegmentAllocatorPREVIEW |
prefixAllocator |
Возвращает выделенный сегмент, который отвечает на запросы выделения, перерабатывая один сегмент. |
static SegmentAllocatorPREVIEW |
slicingAllocator |
Возвращает выделенный сегмент, который отвечает на запросы выделения, возвращая последовательные части, полученные из предоставленного сегмента. |
Подробное описание методов
allocateUtf8String
default MemorySegmentPREVIEW allocateUtf8String(String str)
Этот метод всегда заменяет последовательности с неверным форматом и неотображаемыми символами на стандартный массив замены кодировки. Класс CharsetEncoder должен использоваться, если требуется больший контроль над процессом кодирования.
Если заданная строка содержит '\0' символы, они также будут скопированы. Это означает, что в зависимости от метода чтения строки, например, MemorySegment.getUtf8String(long)ПРЕВЬЮ, строка будет отображаться усечённой при повторном чтении.
- Требования к реализации:
- стандартная реализация этого метода копирует содержимое предоставленной строки Java в новый сегмент памяти, полученный путём вызова
this.allocate(str.length() + 1). - Параметры:
-
str- строка Java, которая должна быть преобразована в строку C. - Возвращает:
- новый системный сегмент, содержащий преобразованную строку C.
allocate
default MemorySegmentPREVIEW allocate(ValueLayout.OfBytePREVIEW layout, byte value)
- Требования к реализации:
- стандартная реализация этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- структура блока памяти, который необходимо выделить. -
value- значение, которое необходимо установить в новом блоке памяти. - Возвращает:
- сегмент для нового выделенного блока памяти.
allocate
default MemorySegmentPREVIEW allocate(ValueLayout.OfCharPREVIEW layout, char value)
- Требования к реализации:
- стандартная реализация этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- структура блока памяти, который необходимо выделить. -
value- значение, которое необходимо установить в новом блоке памяти. - Возвращает:
- сегмент для нового выделенного блока памяти.
выделить
default MemorySegmentPREVIEW allocate(ValueLayout.OfShortPREVIEW layout, short value)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- структура блока памяти, подлежащего выделению. -
value- значение, которое должно быть установлено в вновь выделенном блоке памяти. - Возвращает:
- сегмент для вновь выделенного блока памяти.
выделить
default MemorySegmentPREVIEW allocate(ValueLayout.OfIntPREVIEW layout, int value)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- структура блока памяти, подлежащего выделению. -
value- значение, которое должно быть установлено в вновь выделенном блоке памяти. - Возвращает:
- сегмент для вновь выделенного блока памяти.
выделить
default MemorySegmentPREVIEW allocate(ValueLayout.OfFloatPREVIEW layout, float value)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- структура блока памяти, подлежащего выделению. -
value- значение, которое должно быть установлено в вновь выделенном блоке памяти. - Возвращает:
- сегмент для вновь выделенного блока памяти.
выделить
default MemorySegmentPREVIEW allocate(ValueLayout.OfLongPREVIEW layout, long value)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- структура блока памяти, подлежащего выделению. -
value- значение, которое должно быть установлено в вновь выделенном блоке памяти. - Возвращает:
- сегмент для вновь выделенного блока памяти.
выделить
default MemorySegmentPREVIEW allocate(ValueLayout.OfDoublePREVIEW layout, double value)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- представление блока памяти, подлежащего выделению. -
value- значение, которое нужно установить в новом блоке памяти. - Возвращает:
- сегмент для вновь выделенного блока памяти.
выделить
default MemorySegmentPREVIEW allocate(AddressLayoutPREVIEW layout, MemorySegmentPREVIEW value)
ValueLayout.ADDRESSПРОСМОТР).- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- представление блока памяти, подлежащего выделению. -
value- значение, которое нужно установить в новом блоке памяти. - Возвращает:
- сегмент для вновь выделенного блока памяти.
выделитьМассив
default MemorySegmentPREVIEW allocateArray(ValueLayout.OfBytePREVIEW elementLayout, byte... elements)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- представление элемента массива, подлежащего выделению. -
elements- байтовые элементы, которые нужно скопировать в новый выделенный блок памяти. - Возвращает:
- сегмент для вновь выделенного блока памяти.
allocateArray
default MemorySegmentPREVIEW allocateArray(ValueLayout.OfShortPREVIEW elementLayout, short... elements)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- структура элемента массива, который должен быть выделен. -
elements- элементы типа short, которые должны быть скопированы в новый выделенный блок памяти. - Возвращает:
- сегмент для нового выделенного блока памяти.
allocateArray
default MemorySegmentPREVIEW allocateArray(ValueLayout.OfCharPREVIEW elementLayout, char... elements)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- структура элемента массива, который должен быть выделен. -
elements- элементы типа char, которые должны быть скопированы в новый выделенный блок памяти. - Возвращает:
- сегмент для нового выделенного блока памяти.
allocateArray
default MemorySegmentPREVIEW allocateArray(ValueLayout.OfIntPREVIEW elementLayout, int... elements)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- структура элемента массива, который должен быть выделен. -
elements- элементы типа int, которые должны быть скопированы в новый выделенный блок памяти. - Возвращает:
- сегмент для нового выделенного блока памяти.
allocateArray
default MemorySegmentPREVIEW allocateArray(ValueLayout.OfFloatPREVIEW elementLayout, float... elements)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- структура элемента массива, который должен быть выделен. -
elements- элементы типа float, которые должны быть скопированы в новый выделенный блок памяти. - Возвращает:
- сегмент для нового выделенного блока памяти.
allocateArray
default MemorySegmentPREVIEW allocateArray(ValueLayout.OfLongPREVIEW elementLayout, long... elements)
- Требования к реализации:
- стандартная реализация этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- структура элемента массива, который необходимо выделить. -
elements- элементы типа long, которые нужно скопировать в новый выделенный блок памяти. - Возвращает:
- сегмент для нового выделенного блока памяти.
allocateArray
default MemorySegmentPREVIEW allocateArray(ValueLayout.OfDoublePREVIEW elementLayout, double... elements)
- Требования к реализации:
- стандартная реализация этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- структура элемента массива, который необходимо выделить. -
elements- элементы типа double, которые нужно скопировать в новый выделенный блок памяти. - Возвращает:
- сегмент для нового выделенного блока памяти.
allocate
default MemorySegmentPREVIEW allocate(MemoryLayoutPREVIEW layout)
- Требования к реализации:
- стандартная реализация этого метода вызывает
this.allocate(layout.byteSize(), layout.byteAlignment()). - Параметры:
-
layout- структура блока памяти, который необходимо выделить. - Возвращает:
- сегмент для нового выделенного блока памяти.
allocateArray
default MemorySegmentPREVIEW allocateArray(MemoryLayoutPREVIEW elementLayout, long count)
- Требования к реализации:
- стандартная реализация этого метода вызывает
this.allocate(MemoryLayout.sequenceLayout(count, elementLayout)). - Параметры:
-
elementLayout- структура элемента массива. -
count- количество элементов массива. - Возвращает:
- сегмент для нового выделенного блока памяти.
- Исключение:
-
IllegalArgumentException- еслиelementLayout.byteSize() * countпереполняется. -
IllegalArgumentException- еслиcount < 0.
выделить
default MemorySegmentPREVIEW allocate(long byteSize)
- Требования к реализации:
- стандартная реализация этого метода вызывает
this.allocate(byteSize, 1). - Параметры:
-
byteSize- размер (в байтах) выделяемого блока памяти. - Возвращает:
- сегмент для нового выделенного блока памяти.
- Исключения:
-
IllegalArgumentException- еслиbyteSize < 0
выделить
MemorySegmentPREVIEW allocate(long byteSize, long byteAlignment)
- Параметры:
-
byteSize- размер (в байтах) выделяемого блока памяти. -
byteAlignment- выравнивание (в байтах) выделяемого блока памяти. - Возвращает:
- сегмент для нового выделенного блока памяти.
- Исключения:
-
IllegalArgumentException- еслиbyteSize < 0,byteAlignment <= 0, или еслиbyteAlignmentне является степенью двойки.
slicingAllocator
static SegmentAllocatorPREVIEW slicingAllocator(MemorySegmentPREVIEW segment)
Возвращаемый выделенщик выбрасывает IndexOutOfBoundsException, когда фрагмент предоставленного сегмента с запрошенным размером и выравниванием не может быть найден.
- Примечание к реализации:
- Выделенщик фрагментов не является потокобезопасным.
- Параметры:
-
segment- сегмент, из которого возвращаемый выделенщик должен извлекать фрагменты. - Возвращает:
- новый выделенщик фрагментов
prefixAllocator
static SegmentAllocatorPREVIEW prefixAllocator(MemorySegmentPREVIEW segment)
0, отсюда и название prefix allocator. Эквивалентно (но, вероятно, более эффективно), чем следующий код: MemorySegment segment = ...
SegmentAllocator prefixAllocator = (size, align) -> segment.asSlice(0, size, align);
IndexOutOfBoundsException, когда срез предоставленного сегмента с запрошенным размером и выравниванием не может быть найден.- Примечание API:
- Префиксный аллокатор может быть полезен для ограничения запросов выделения в случае, если клиент знает, что он полностью обработает содержимое выделенного сегмента до момента следующего запроса выделения.
- Примечание реализации:
- Хотя префиксный аллокатор безопасен для потоков, одновременный доступ к одному и тому же аллокатору переиспользования может привести к тому, что поток перезапишет содержимое, записанное в основной сегмент другим потоком.
- Параметры:
-
segment- сегмент памяти, который будет переиспользоваться возвращаемым аллокатором. - Возвращает:
- аллокатор, который переиспользует существующий сегмент при каждом новом запросе выделения.
© 1993, 2023, 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/21/docs/api/java.base/java/lang/foreign/SegmentAllocator.html
SegmentAllocatorтолько при включённых предварительных функциях.