Интерфейс SegmentAllocator
- Функциональный интерфейс:
- Это функциональный интерфейс и, следовательно, может быть использован в качестве целевого назначения лямбда-выражения или ссылки на метод.
@FunctionalInterface public interface SegmentAllocator
allocate(long, long). Этот интерфейс определяет несколько методов по умолчанию, которые могут быть полезны для создания сегментов из различных типов значений Java, таких как примитивы и массивы. Этот интерфейс можно рассматривать как тонкий оболочку основных возможностей для создания нативных сегментов (например, MemorySegment.allocateNative(long, long, ResourceScope)); так как SegmentAllocator является функциональным интерфейсом, клиенты могут легко получить нативный аллокатор, используя лямбда-выражение или ссылку на метод. Этот интерфейс предоставляет фабрику, а именно ofScope(ResourceScope), которая может быть использована для получения ограниченного аллокатора, то есть аллокатора, который создает сегмент, ограниченный заданным scope. Это может быть полезно при работе внутри конструкции try-with-resources:
Кроме того, этот интерфейс также определяет фабрики для часто используемых аллокаторов; например,try (ResourceScope scope = ResourceScope.newConfinedScope()) { SegmentAllocator allocator = SegmentAllocator.ofScope(scope); ... }
arenaAllocator(ResourceScope) и arenaAllocator(long, ResourceScope) являются аллокаторами на основе арены. Наконец, ofSegment(MemorySegment) возвращает аллокатор, который оборачивает сегмент (в куче или вне кучи) и перерабатывает его содержимое при каждом новом запросе на выделение.Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
default MemorySegment |
allocate |
Выделение блока памяти заданного размера с выравниванием по умолчанию (выравнивание по 1 байту). |
MemorySegment |
allocate |
Выделение блока памяти заданного размера и ограничения выравнивания. |
default MemorySegment |
allocate |
Выделение блока памяти с заданной структурой. |
default MemorySegment |
allocate |
Выделение блока памяти с заданной структурой и инициализация его заданным байтовым значением. |
default MemorySegment |
allocate |
Выделение блока памяти с заданной структурой и инициализация его заданным символьным значением. |
default MemorySegment |
allocate |
Выделение блока памяти с заданной структурой и инициализация его заданным двойным значением. |
default MemorySegment |
allocate |
Выделение блока памяти с заданной структурой и инициализация его заданным плавающим значением. |
default MemorySegment |
allocate |
Выделение блока памяти с заданной структурой и инициализация его заданным целочисленным значением. |
default MemorySegment |
allocate |
Выделение блока памяти с заданной структурой и инициализация его заданным длинным значением. |
default MemorySegment |
allocate |
Выделение блока памяти с заданной структурой и инициализация его заданным коротким значением. |
default MemorySegment |
allocate |
Выделение блока памяти с заданной структурой и инициализация его заданным значением адреса (выраженного как экземпляр Addressable). |
default MemorySegment |
allocateArray |
Выделение блока памяти, соответствующего массиву с заданной структурой элементов и размером. |
default MemorySegment |
allocateArray |
Выделение блока памяти с заданной структурой и инициализация его заданным массивом байт. |
default MemorySegment |
allocateArray |
Выделение блока памяти с заданной структурой и инициализация его заданным массивом символов. |
default MemorySegment |
allocateArray |
Выделение блока памяти с заданной структурой и инициализация его заданным массивом двойных значений. |
default MemorySegment |
allocateArray |
Выделение блока памяти с заданной структурой и инициализация его заданным массивом плавающих значений. |
default MemorySegment |
allocateArray |
Выделение блока памяти с заданной структурой и инициализация его заданным целочисленным массивом. |
default MemorySegment |
allocateArray |
Выделение блока памяти с заданной структурой и инициализация его заданным длинным массивом. |
default MemorySegment |
allocateArray |
Выделение блока памяти с заданной структурой и инициализация его заданным коротким массивом. |
default MemorySegment |
allocateArray |
Выделение блока памяти с заданной структурой и инициализация его заданным массивом адресов. |
static SegmentAllocator |
arenaAllocator |
Возвращает аллокатор на основе нативной арены, который выделяет один сегмент памяти заданного размера (используя malloc), а затем реагирует на запросы выделения, возвращая различные фрагменты того же сегмента (пока это возможно). |
static SegmentAllocator |
arenaAllocator |
Возвращает неограниченный аллокатор на основе нативной арены. |
static SegmentAllocator |
ofScope |
Возвращает нативный аллокатор, который реагирует на запросы выделения, выделяя новые сегменты, ограниченные заданным scope ресурсов, используя фабрику MemorySegment.allocateNative(long, long, ResourceScope). |
static SegmentAllocator |
ofSegment |
Возвращает аллокатор сегментов, который реагирует на запросы выделения, перерабатывая один сегмент; то есть, каждый новый запрос на выделение вернет новый срез, начиная с смещения сегмента 0 (ограничения выравнивания игнорируются этим аллокатором). |
Подробное описание методов
allocate
default MemorySegment allocate(ValueLayout layout, byte value)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- компоновка выделяемого блока памяти. -
value- значение, которое должно быть установлено в новом блоке памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиlayout.byteSize()не соответствует размеру значения байта.
allocate
default MemorySegment allocate(ValueLayout layout, char value)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- компоновка выделяемого блока памяти. -
value- значение, которое должно быть установлено в новом блоке памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиlayout.byteSize()не соответствует размеру значения символа.
allocate
default MemorySegment allocate(ValueLayout layout, short value)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- компоновка выделяемого блока памяти. -
value- значение, которое должно быть установлено в новом блоке памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиlayout.byteSize()не соответствует размеру значения короткого целого.
allocate
default MemorySegment allocate(ValueLayout layout, int value)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- компоновка выделяемого блока памяти. -
value- значение, которое должно быть установлено в новом блоке памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиlayout.byteSize()не соответствует размеру значения целого числа.
allocate
default MemorySegment allocate(ValueLayout layout, float value)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- компоновка выделяемого блока памяти. -
value- значение, которое должно быть установлено в новом блоке памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиlayout.byteSize()не соответствует размеру значения числа с плавающей точкой.
allocate
default MemorySegment allocate(ValueLayout layout, long value)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- компоновка выделяемого блока памяти. -
value- значение, которое должно быть установлено в новом блоке памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиlayout.byteSize()не соответствует размеру значения длинного целого.
allocate
default MemorySegment allocate(ValueLayout layout, double value)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- компоновка выделяемого блока памяти. -
value- значение, которое должно быть установлено в новом блоке памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиlayout.byteSize()не соответствует размеру значения с двойной точностью.
allocate
default MemorySegment allocate(ValueLayout layout, Addressable value)
Addressable). Значение адреса может быть сужено в соответствии с размером адреса платформы (см. MemoryLayouts.ADDRESS).- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocate(layout). - Параметры:
-
layout- компоновка выделяемого блока памяти. -
value- значение, которое должно быть установлено в новом блоке памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиlayout.byteSize() != MemoryLayouts.ADDRESS.byteSize().
allocateArray
default MemorySegment allocateArray(ValueLayout elementLayout, byte[] array)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- компоновка элемента массива, который должен быть выделен. -
array- массив, который должен быть скопирован в новый выделенный блок памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиelementLayout.byteSize()не соответствует размеру значения байта.
allocateArray
default MemorySegment allocateArray(ValueLayout elementLayout, short[] array)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- компоновка элемента массива, который должен быть выделен. -
array- массив, который должен быть скопирован в новый выделенный блок памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиelementLayout.byteSize()не соответствует размеру значения короткого целого.
allocateArray
default MemorySegment allocateArray(ValueLayout elementLayout, char[] array)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- компоновка элемента массива, который должен быть выделен. -
array- массив, который должен быть скопирован в новый выделенный блок памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиelementLayout.byteSize()не соответствует размеру значения символа.
allocateArray
default MemorySegment allocateArray(ValueLayout elementLayout, int[] array)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- компоновка элемента массива, который должен быть выделен. -
array- массив, который должен быть скопирован в новый выделенный блок памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиelementLayout.byteSize()не соответствует размеру значения целого числа.
allocateArray
default MemorySegment allocateArray(ValueLayout elementLayout, float[] array)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- компоновка элемента массива, который должен быть выделен. -
array- массив, который должен быть скопирован в новый выделенный блок памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиelementLayout.byteSize()не соответствует размеру значения числа с плавающей точкой.
allocateArray
default MemorySegment allocateArray(ValueLayout elementLayout, long[] array)
- Требования к реализации:
- реализация по умолчанию для этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- компоновка элемента массива, который должен быть выделен. -
array- массив, который должен быть скопирован в новый выделенный блок памяти. - Возвращает:
- сегмент для нового блока выделенной памяти.
- Исключения:
-
IllegalArgumentException- еслиelementLayout.byteSize()не соответствует размеру значения длинного целого.
allocateArray
default MemorySegment allocateArray(ValueLayout elementLayout, double[] array)
- Требования к реализации:
- стандартная реализация этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- структура элемента массива, который будет выделен. -
array- массив, который будет скопирован в новый выделенный блок памяти. - Возвращает:
- сегмент для нового выделенного блока памяти.
- Исключения:
-
IllegalArgumentException- еслиelementLayout.byteSize()не соответствует размеру значения double.
allocateArray
default MemorySegment allocateArray(ValueLayout elementLayout, Addressable[] array)
MemoryLayouts.ADDRESS).- Требования к реализации:
- стандартная реализация этого метода вызывает
this.allocateArray(layout, array.length). - Параметры:
-
elementLayout- структура элемента массива, который будет выделен. -
array- массив, который будет скопирован в новый выделенный блок памяти. - Возвращает:
- сегмент для нового выделенного блока памяти.
- Исключения:
-
IllegalArgumentException- еслиlayout.byteSize() != MemoryLayouts.ADDRESS.byteSize().
allocate
default MemorySegment allocate(MemoryLayout layout)
- Требования к реализации:
- стандартная реализация этого метода вызывает
this.allocate(layout.byteSize(), layout.byteAlignment()). - Параметры:
-
layout- структура блока памяти, который будет выделен. - Возвращает:
- сегмент для нового выделенного блока памяти.
allocateArray
default MemorySegment allocateArray(MemoryLayout elementLayout, long count)
- Требования к реализации:
- стандартная реализация этого метода вызывает
this.allocate(MemoryLayout.sequenceLayout(count, elementLayout)). - Параметры:
-
elementLayout- структура элемента массива. -
count- количество элементов массива. - Возвращает:
- сегмент для нового выделенного блока памяти.
allocate
default MemorySegment allocate(long bytesSize)
- Требования к реализации:
- стандартная реализация этого метода вызывает
this.allocate(bytesSize, 1). - Параметры:
-
bytesSize- размер (в байтах) блока памяти, который будет выделен. - Возвращает:
- сегмент для нового выделенного блока памяти.
allocate
MemorySegment allocate(long bytesSize, long bytesAlignment)
- Параметры:
-
bytesSize- размер (в байтах) блока памяти, который будет выделен. -
bytesAlignment- выравнивание (в байтах) блока памяти, который будет выделен. - Возвращает:
- сегмент для нового выделенного блока памяти.
arenaAllocator
static SegmentAllocator arenaAllocator(long size, ResourceScope scope)
Аллокатор, связанный со совместным объемом ресурсов, является потокобезопасным, и запросы на выделение можно выполнять параллельно; напротив, если аллокатор арены связан со ограниченным объемом ресурсов, запросы на выделение могут выполняться только из потока, владеющего объемом ресурсов аллокатора.
Возвращаемый аллокатор может выбросить OutOfMemoryError, если входящий запрос на выделение превышает емкость аллокатора.
- Параметры:
-
size- размер области выделения арены (в байтах). -
scope- объем ресурсов, связанный с сегментами, возвращаемыми этим аллокатором. - Возвращает:
- новый ограниченный аллокатор на основе арены
- Исключения:
-
IllegalArgumentException- еслиsize <= 0. -
IllegalStateException- еслиscopeуже закрыт, или если доступ происходит из потока, отличного от потока, владеющегоscope.
arenaAllocator
static SegmentAllocator arenaAllocator(ResourceScope scope)
Возвращаемый аллокатор выделяет сегмент памяти S определенного фиксированного размера (используя malloc), а затем отвечает на запросы выделения одним из следующих способов:
- если размер запросов на выделение меньше размера
S, и уSесть свободный фрагментS', который подходит для этого запроса на выделение, вернуть этотS'. - если размер запросов на выделение меньше размера
S, и уSнет свободных фрагментов, которые подходят для этого запроса на выделение, выделить новый сегментS'(используя malloc), который имеет такой же размер, какSи установитьS = S'; затем аллокатор пытается ответить на тот же запрос на выделение снова. - если размер запросов на выделение больше размера
S, выделить новый сегментS'(используя malloc), который имеет достаточный размер для удовлетворения запроса на выделение, и вернутьS'.
Этот аллокатор сегментов может быть полезен, когда клиентам нужно выполнить несколько запросов на выделение, избегая затрат, связанных с выделением новой области памяти вне кучи при каждом запросе на выделение.
Аллокатор, связанный со совместным объемом ресурсов, является потокобезопасным, и запросы на выделение можно выполнять параллельно; напротив, если аллокатор арены связан с ограниченным объемом ресурсов, запросы на выделение могут выполняться только из потока, владеющего объемом ресурсов аллокатора.
Возвращаемый аллокатор может выбросить OutOfMemoryError, если входящий запрос на выделение превышает системную емкость.
- Параметры:
-
scope- объем ресурсов, связанный с сегментами, возвращаемыми этим аллокатором. - Возвращает:
- новый неограниченный аллокатор на основе арены
- Исключения:
-
IllegalStateException- еслиscopeуже закрыт, или если доступ происходит из потока, отличного от потока, владеющегоscope.
ofSegment
static SegmentAllocator ofSegment(MemorySegment segment)
0 (ограничения выравнивания игнорируются этим аллокатором). Это может быть полезно для ограничения запросов на выделение в случае, если клиент знает, что полностью обработает содержимое выделенного сегмента до выполнения последующего запроса на выделение. Хотя аллокатор, возвращаемый этим методом, является потокобезопасным, одновременный доступ к одному и тому же аллокатору повторного использования может привести к тому, что один поток перезапишет содержимое, записанное в подлежащий сегмент другим потоком.
- Параметры:
-
segment- сегмент памяти, который будет переработан возвращаемым аллокатором. - Возвращает:
- аллокатор, который перерабатывает существующий сегмент при каждом новом запросе на выделение.
ofScope
static SegmentAllocator ofScope(ResourceScope scope)
MemorySegment.allocateNative(long, long, ResourceScope). Этот код эквивалентен (но, вероятно, более эффективен) следующему: Resource scope = ... SegmentAllocator scoped = (size, align) -> MemorySegment.allocateNative(size, align, scope);
- Параметры:
-
scope- объем ресурсов, связанный с сегментами, созданными возвращаемым аллокатором. - Возвращает:
- аллокатор, который выделяет новый сегмент памяти, ограниченный заданным объемом ресурсов.
© 1993, 2021, 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/17/docs/api/jdk.incubator.foreign/jdk/incubator/foreign/SegmentAllocator.html