Spec-Zone.ru › OpenJDK 17

Интерфейс MemorySegment

Все суперинтерфейсы:
Addressable
public sealed interface MemorySegment extends Addressable
Сегмент памяти моделирует непрерывный участок памяти. Сегмент памяти связан как с пространственными, так и с временными границами (например, с ResourceScope). Пространственные границы гарантируют, что операции доступа к памяти в сегменте не могут повлиять на местоположение памяти, которое находится вне границ сегмента памяти, к которому происходит доступ. Временные границы гарантируют, что операции доступа к сегменту не могут выполняться после того, как область ресурсов, связанная с сегментом памяти, была закрыта (см. ResourceScope.close()).

Все реализации этого интерфейса должны быть базовыми по значениям; программисты должны рассматривать экземпляры, которые равны, как взаимозаменяемые и не должны использовать экземпляры для синхронизации, в противном случае может произойти непредсказуемое поведение. Например, в будущей версии синхронизация может завершиться ошибкой. Для сравнений необходимо использовать метод equals.

Неплатформенные классы не должны реализовывать MemorySegment напрямую.

Если не указано иное, передача null аргумента или массива аргументов, содержащего один или несколько null элементов, в метод этого класса приводит к выбрасыванию NullPointerException.

Создание сегментов памяти

Существует несколько способов получения сегмента памяти. Во-первых, сегменты памяти, поддерживаемые внекучной памятью, могут быть выделены с помощью одного из многочисленных методов фабрики (см. allocateNative(MemoryLayout, ResourceScope), allocateNative(long, ResourceScope) и allocateNative(long, long, ResourceScope)). Сегменты памяти, полученные таким образом, называются сегментами нативной памяти.

Также можно получить сегмент памяти, поддерживаемый существующим выделенным в куче массивом Java, используя один из предоставленных методов фабрики (например, ofArray(int[])). Сегменты памяти, полученные таким образом, называются сегментами массивов.

Можно получить сегмент памяти, поддерживаемый существующим буфером байтов Java (см. ByteBuffer), используя метод фабрики ofByteBuffer(ByteBuffer). Сегменты памяти, полученные таким образом, называются сегментами буферов. Обратите внимание, что сегменты буферов могут быть поддерживаемыми нативной памятью (как в случае сегментов нативной памяти) или памятью кучи (как в случае сегментов массивов), в зависимости от характеристик экземпляра буфера байтов, с которым связан сегмент. Например, сегмент буфера, полученный из буфера байтов, созданного с помощью метода ByteBuffer.allocateDirect(int), будет поддерживаться нативной памятью.

Сопоставление сегментов памяти с файлами

Также можно получить сегмент нативной памяти, поддерживаемый сопоставленным файлом памяти, используя метод фабрики mapFile(Path, long, long, FileChannel.MapMode, ResourceScope). Такие сегменты нативной памяти называются сопоставленными сегментами памяти; сопоставленные сегменты памяти связаны с подлежащим дескриптором файла.

Содержимое сопоставленных сегментов памяти может быть сохранено и загружено в/из подлежащий файл; эти возможности являются подходящими заменителями некоторых функций класса MappedByteBuffer. Обратите внимание, что, хотя можно отобразить сегмент в буфер байтов (см. asByteBuffer()), а затем вызвать, например, MappedByteBuffer.force() таким образом, это можно сделать только в том случае, если исходный сегмент достаточно мал из-за ограничения размера, присущего API ByteBuffer.

Клиенты, которым требуется сложный, низкоуровневый контроль над сопоставленными сегментами памяти, должны рассмотреть возможность написания пользовательских фабрик сопоставленных сегментов памяти; используя CLinker, например, в Linux, возможно вызвать mmap с желаемыми параметрами; возвращенный адрес можно легко обернуть в сегмент памяти, используя MemoryAddress.ofLong(long) и MemoryAddress.asSegment(long, Runnable, ResourceScope).

Жизненный цикл и ограничение

Сегменты памяти связаны с областью ресурсов (см. ResourceScope), к которой можно получить доступ, используя метод scope(). Как и для всех ресурсов, связанных с областью ресурсов, к сегменту нельзя получить доступ после закрытия соответствующей области. Например, следующий код приведет к ошибке:

MemorySegment segment = null;
try (ResourceScope scope = ResourceScope.newConfinedScope()) {
    segment = MemorySegment.allocateNative(8, 1, scope);
}
MemoryAccess.getLong(segment); // already closed!
 
Кроме того, доступ к сегменту памяти ограничен проверками ограничения потоков, навязанными владельцем области; то есть, если сегмент связан с общей областью, к нему может получить доступ несколько потоков; если он связан с ограниченной областью, к нему может получить доступ только поток, которому принадлежит область.

Сегменты кучи и буфера всегда связаны с глобальной, общей областью. Эту область нельзя закрыть, и ее можно считать всегда активной.

Представления сегментов памяти

Сегменты памяти поддерживают представления. Например, можно создать неизменяемое представление сегмента памяти следующим образом:

MemorySegment segment = ...
MemorySegment roSegment = segment.asReadOnly();
 
Также можно создать представления, пространственные границы которых строже, чем у исходного сегмента (см. asSlice(long, long)).

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

Для обеспечения совместимости с существующим кодом можно получить представление буфера байтов из сегмента памяти (см. asByteBuffer()). Это может быть полезно, например, для тех клиентов, которые хотят продолжать использовать API ByteBuffer, но должны работать с большими сегментами памяти. Буферы байтов, полученные таким образом, поддерживают те же пространственные и временные ограничения доступа, связанные с сегментом памяти, из которого они произошли.

Поддержка потоков

Клиент может получить Stream из сегмента, который затем может быть использован для разделения сегмента (в соответствии с заданным расположением элементов) и даже позволит нескольким потокам работать параллельно над непересекающимися частями сегмента (для этого сегмент должен быть связан с общей областью). Следующий код может быть использован для суммирования всех целочисленных значений в сегменте памяти параллельно:

try (ResourceScope scope = ResourceScope.newSharedScope()) {
    SequenceLayout SEQUENCE_LAYOUT = MemoryLayout.sequenceLayout(1024, MemoryLayouts.JAVA_INT);
    MemorySegment segment = MemorySegment.allocateNative(SEQUENCE_LAYOUT, scope);
    VarHandle VH_int = SEQUENCE_LAYOUT.elementLayout().varHandle(int.class);
    int sum = segment.elements(MemoryLayouts.JAVA_INT).parallel()
                           .mapToInt(s -> (int)VH_int.get(s.address()))
                           .sum();
}
 
Требования к реализации:
Реализации этого интерфейса являются неизменяемыми, потокобезопасными и базовыми по значениям.

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

Modifier and Type Method Description
MemoryAddress address()
Базовый адрес памяти, связанный с этим сегментом памяти.
static MemorySegment allocateNative(long bytesSize, long alignmentBytes, ResourceScope scope)
Создает новый ограниченный сегмент памяти, моделирующий только что выделенный блок памяти вне кучи заданного размера (в байтах), ограничения выравнивания (в байтах) и области ресурсов.
static MemorySegment allocateNative(long bytesSize, ResourceScope scope)
Создает новый ограниченный сегмент памяти, моделирующий только что выделенный блок памяти вне кучи заданного размера (в байтах) и области ресурсов.
static MemorySegment allocateNative(MemoryLayout layout, ResourceScope scope)
Создает новый ограниченный сегмент памяти, моделирующий только что выделенный блок памяти вне кучи с заданной структурой и областью ресурсов.
ByteBuffer asByteBuffer()
Оборачивает этот сегмент в ByteBuffer.
MemorySegment asReadOnly()
Получает доступ в режиме только для чтения к этому сегменту.
default MemorySegment asSlice(long offset)
Получает новый вид сегмента памяти, базовый адрес которого совпадает с базовым адресом этого сегмента плюс заданный смещение, а новый размер вычисляется путем вычитания заданного смещения из размера этого сегмента.
MemorySegment asSlice(long offset, long newSize)
Получает новый вид сегмента памяти, базовый адрес которого совпадает с базовым адресом этого сегмента плюс заданный смещение, а новый размер задается заданным аргументом.
default MemorySegment asSlice(MemoryAddress newBase)
Получает новый вид сегмента памяти, базовый адрес которого равен заданному адресу, а новый размер вычисляется путем вычитания смещения адреса относительно этого сегмента (см. MemoryAddress.segmentOffset(MemorySegment)) из размера этого сегмента.
default MemorySegment asSlice(MemoryAddress newBase, long newSize)
Получает новый вид сегмента памяти, базовый адрес которого равен заданному адресу, а новый размер задается заданным аргументом.
long byteSize()
Размер (в байтах) этого сегмента памяти.
void copyFrom(MemorySegment src)
Выполняет копирование данных из заданного исходного сегмента в этот сегмент.
Stream<MemorySegment> elements(MemoryLayout elementLayout)
Возвращает последовательный Stream по непересекающимся срезам (размер которых соответствует заданной структуре) в этом сегменте.
MemorySegment fill(byte value)
Заполняет значение в этом сегменте памяти.
void force()
Принудительно записывает все изменения, внесенные в содержимое этого отображенного сегмента, на устройство хранения данных, описанное дескриптором файла отображенного сегмента.
static MemorySegment globalNativeSegment()
Возвращает сегмент нативной памяти, базовый адрес которого равен MemoryAddress.NULL, а размер равен Long.MAX_VALUE.
boolean isLoaded()
Указывает, присутствует ли содержимое этого отображенного сегмента в физической памяти.
boolean isMapped()
Является ли это отображенный сегмент?
boolean isNative()
Является ли этот сегмент сегментом нативной памяти?
boolean isReadOnly()
Является ли этот сегмент только для чтения?
void load()
Загружает содержимое этого отображенного сегмента в физическую память.
static MemorySegment mapFile(Path path, long bytesOffset, long bytesSize, FileChannel.MapMode mapMode, ResourceScope scope)
Создает новый отображенный сегмент памяти, который моделирует область памяти, сопоставленную с файлом из заданного пути.
long mismatch(MemorySegment other)
Находит и возвращает смещение (в байтах) первой несовпадения между этим сегментом и заданным другим сегментом.
static MemorySegment ofArray(byte[] arr)
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом байтов, выделенным в куче.
static MemorySegment ofArray(char[] arr)
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом символов, выделенным в куче.
static MemorySegment ofArray(double[] arr)
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом double, выделенным в куче.
static MemorySegment ofArray(float[] arr)
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом float, выделенным в куче.
static MemorySegment ofArray(int[] arr)
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом int, выделенным в куче.
static MemorySegment ofArray(long[] arr)
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом long, выделенным в куче.
static MemorySegment ofArray(short[] arr)
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом short, выделенным в куче.
static MemorySegment ofByteBuffer(ByteBuffer bb)
Создает новый ограниченный сегмент памяти типа буфер, который моделирует память, связанную с заданным буфером byte.
ResourceScope scope()
Возвращает область ресурсов, связанную с этим сегментом памяти.
Spliterator<MemorySegment> spliterator(MemoryLayout elementLayout)
Возвращает итератор для этого сегмента памяти.
byte[] toByteArray()
Копирует содержимое этого сегмента памяти в новый массив байтов.
char[] toCharArray()
Копирует содержимое этого сегмента памяти в новый массив символов.
double[] toDoubleArray()
Копирует содержимое этого сегмента памяти в новый массив double.
float[] toFloatArray()
Копирует содержимое этого сегмента памяти в новый массив float.
int[] toIntArray()
Копирует содержимое этого сегмента памяти в новый массив int.
long[] toLongArray()
Копирует содержимое этого сегмента памяти в новый массив long.
short[] toShortArray()
Копирует содержимое этого сегмента памяти в новый массив short.
void unload()
Выгружает содержимое этого отображенного сегмента из физической памяти.

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

address

MemoryAddress address()
Базовый адрес памяти, связанный с этим сегментом памяти. Возвращаемый адрес памяти связан с тем же объемом ресурсов, что и этот сегмент.
Указано в:
address в интерфейсе Addressable
Возвращает:
Базовый адрес памяти.

spliterator

Spliterator<MemorySegment> spliterator(MemoryLayout elementLayout)
Возвращает разбиение для этого сегмента памяти. Возвращаемое разбиение сообщает о характеристиках Spliterator.SIZED, Spliterator.SUBSIZED, Spliterator.IMMUTABLE, Spliterator.NONNULL и Spliterator.ORDERED.

Возвращаемое разбиение разделяет этот сегмент в соответствии с указанной компоновкой элементов; то есть, если предоставленная компоновка имеет размер N, то вызов Spliterator.trySplit() приведет к разбиению, содержащему примерно S/N/2 элементов (в зависимости от того, является ли N чётным или нет), где S - размер этого сегмента. Таким образом, разбиение возможно, если S/N >= 2. Разбиение возвращает сегменты, которые имеют тот же объем, что и данный сегмент.

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

Параметры:
elementLayout - компоновка, используемая для разбиения.
Возвращает:
разбиение элементов для этого сегмента
Исключение:
IllegalArgumentException - если размер elementLayout равен нулю, или остаток от деления размера сегмента на размер elementLayout больше нуля.

elements

Stream<MemorySegment> elements(MemoryLayout elementLayout)
Возвращает последовательность Stream по непересекающимся фрагментам (размер которых соответствует указанной компоновке) в этом сегменте. Вызов этого метода эквивалентен следующему коду:

    StreamSupport.stream(segment.spliterator(elementLayout), false);
 
Параметры:
elementLayout - компоновка, используемая для разбиения.
Возвращает:
последовательность Stream по непересекающимся фрагментам в этом сегменте.
Исключение:
IllegalArgumentException - если размер elementLayout равен нулю, или остаток от деления размера сегмента на размер elementLayout больше нуля.

scope

ResourceScope scope()
Возвращает область ресурсов, связанную с этим сегментом памяти.
Возвращает:
область ресурсов, связанная с этим сегментом памяти.

byteSize

long byteSize()
Размер (в байтах) этого сегмента памяти.
Возвращает:
Размер (в байтах) этого сегмента памяти.

asSlice

MemorySegment asSlice(long offset, long newSize)
Получает новый вид сегмента памяти, базовый адрес которого совпадает с базовым адресом этого сегмента плюс заданный смещение, а новый размер задается заданным аргументом.
Параметры:
offset - новое смещение базового сегмента (относительно текущего базового адреса сегмента), указанное в байтах.
newSize - новый размер сегмента, указанный в байтах.
Возвращает:
новый вид сегмента памяти с обновлёнными адресами начала/конца.
Исключение:
IndexOutOfBoundsException - если offset < 0, offset > byteSize(), newSize < 0, или newSize > byteSize() - offset
См. также:
  • asSlice(long)
  • asSlice(MemoryAddress)
  • asSlice(MemoryAddress, long)

asSlice

default MemorySegment asSlice(MemoryAddress newBase, long newSize)
Получает новый вид сегмента памяти, базовый адрес которого задан, а новый размер задан заданным аргументом.

Эквивалентно следующему коду:


    asSlice(newBase.segmentOffset(this), newSize);
 
Параметры:
newBase - новый базовый адрес сегмента.
newSize - новый размер сегмента, указанный в байтах.
Возвращает:
новый вид сегмента памяти с обновлёнными адресами начала/конца.
Исключение:
IndexOutOfBoundsException - если offset < 0, offset > byteSize(), newSize < 0, или newSize > byteSize() - offset
См. также:
  • asSlice(long)
  • asSlice(MemoryAddress)
  • asSlice(long, long)

asSlice

default MemorySegment asSlice(long offset)
Получает новый вид сегмента памяти, базовый адрес которого совпадает с базовым адресом этого сегмента плюс заданное смещение, а новый размер вычисляется путём вычитания указанного смещения из размера этого сегмента.

Эквивалентно следующему коду:


    asSlice(offset, byteSize() - offset);
 
Параметры:
offset - новое смещение базового сегмента (относительно текущего базового адреса сегмента), указанное в байтах.
Возвращает:
новый вид сегмента памяти с обновлёнными адресами начала/конца.
Исключение:
IndexOutOfBoundsException - если offset < 0, или offset > byteSize().
См. также:
  • asSlice(MemoryAddress)
  • asSlice(MemoryAddress, long)
  • asSlice(long, long)

asSlice

default MemorySegment asSlice(MemoryAddress newBase)
Получает новый вид сегмента памяти, базовый адрес которого задан, а новый размер вычисляется путём вычитания смещения адреса относительно этого сегмента (см. MemoryAddress.segmentOffset(MemorySegment)) из размера этого сегмента.

Эквивалентно следующему коду:


    asSlice(newBase.segmentOffset(this));
 
Параметры:
newBase - новое смещение базового сегмента (относительно текущего базового адреса сегмента), указанное в байтах.
Возвращает:
новый вид сегмента памяти с обновлёнными адресами начала/конца.
Исключение:
IndexOutOfBoundsException - если address.segmentOffset(this) < 0, или address.segmentOffset(this) > byteSize().
См. также:
  • asSlice(long)
  • asSlice(MemoryAddress, long)
  • asSlice(long, long)

isReadOnly

boolean isReadOnly()
Является ли этот сегмент только для чтения?
Возвращает:
true, если этот сегмент только для чтения.
См. также:
  • asReadOnly()

asReadOnly

MemorySegment asReadOnly()
Получает представление только для чтения этого сегмента. Полученный сегмент будет идентичен этому, но попытки перезаписи содержимого возвращаемого сегмента приведут к исключениям во время выполнения.
Возвращает:
представление только для чтения этого сегмента
См. также:
  • isReadOnly()

isNative

boolean isNative()
Является ли этот сегмент нативным? Возвращает true, если этот сегмент является нативным сегментом памяти, созданным с помощью allocateNative(long, ResourceScope) (и родственных) фабрик, или сегментом буфера, полученным из прямого ByteBuffer с помощью фабрики ofByteBuffer(ByteBuffer), или если это отображенный сегмент.
Возвращает:
true если этот сегмент является нативным сегментом.

isMapped

boolean isMapped()
Является ли этот сегмент отображенным? Возвращает true, если этот сегмент является отображенным сегментом памяти, созданным с помощью mapFile(Path, long, long, FileChannel.MapMode, ResourceScope) фабрики или сегментом буфера, полученным из MappedByteBuffer с помощью фабрики ofByteBuffer(ByteBuffer).
Возвращает:
true если этот сегмент является отображенным сегментом.

fill

MemorySegment fill(byte value)
Заполняет значение в этот сегмент памяти.

Более конкретно, данное значение записывается в каждый адрес этого сегмента. Эквивалентно (но, вероятно, более эффективно, чем) следующему коду:


byteHandle = MemoryLayout.ofSequence(MemoryLayouts.JAVA_BYTE)
         .varHandle(byte.class, MemoryLayout.PathElement.sequenceElement());
for (long l = 0; l < segment.byteSize(); l++) {
     byteHandle.set(segment.address(), l, value);
}
 
без каких-либо ограничений или гарантий на порядок установки отдельных элементов памяти.

Заполнение может быть полезно для инициализации или сброса памяти сегмента.

Параметры:
value - значение для заполнения этого сегмента
Возвращает:
этот сегмент памяти
Исключение:
IllegalStateException - если область ресурсов, связанная с этим сегментом, закрыта или если доступ осуществляется из потока, отличного от потока, владеющего этой областью,
UnsupportedOperationException - если этот сегмент только для чтения (см. isReadOnly()).
END_OF_DOCUMENT_MARKER

copyFrom

void copyFrom(MemorySegment src)
Выполняет копирование содержимого из заданного исходного сегмента в этот сегмент. Более конкретно, байты со смещения 0 до src.byteSize() - 1 в исходном сегменте копируются в этот сегмент со смещением 0 до src.byteSize() - 1. Если исходный сегмент перекрывается с этим сегментом, копирование выполняется так, как если бы байты со смещения 0 до src.byteSize() - 1 в исходном сегменте были сначала скопированы во временный сегмент размером bytes, а затем содержимое временного сегмента было скопировано в этот сегмент со смещением 0 до src.byteSize() - 1.

Результат копирования не определён, если, в редком случае, исходный сегмент и этот сегмент не перекрываются, но ссылаются на перекрывающиеся области одного и того же базового хранилища с помощью разных адресов. Например, это может произойти, если один и тот же файл отображён в два сегмента.

Parameters:
src - исходный сегмент.
Throws:
IndexOutOfBoundsException - если src.byteSize() > this.byteSize().
IllegalStateException - если область, связанная с исходным сегментом, или область, связанная с этим сегментом, уже закрыта, или если доступ происходит из потока, отличного от потока, владеющего этими областями.
UnsupportedOperationException - если этот сегмент является только для чтения (см. isReadOnly()).

mismatch

long mismatch(MemorySegment other)
Находит и возвращает смещение, в байтах, первого несовпадения между этим сегментом и заданным другим сегментом. Смещение относительно базового адреса каждого сегмента и будет в диапазоне от 0 (включительно) до размера (в байтах) меньшего сегмента памяти (исключительно).

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

Parameters:
other - сегмент, который проверяется на несовпадение с этим сегментом
Returns:
относительное смещение, в байтах, первого несовпадения между этим и заданным другим сегментом, иначе -1, если несовпадения нет
Throws:
IllegalStateException - если область, связанная с этим сегментом, или область, связанная с other сегментом, уже закрыта, или если доступ происходит из потока, отличного от потока, владеющего этими областями.

isLoaded

boolean isLoaded()
Указывает, присутствует ли содержимое этого отображённого сегмента в физической памяти.

Значение true подразумевает, что, скорее всего, все данные в этом сегменте находятся в физической памяти и могут быть, следовательно, обработаны без возникновения страниц виртуальной памяти или операций ввода-вывода. Значение false не обязательно означает, что содержимое этого сегмента не находится в физической памяти.

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

Returns:
true если содержимое этого сегмента, вероятно, находится в физической памяти
Throws:
IllegalStateException - если область, связанная с этим сегментом, была закрыта, или если доступ происходит из потока, отличного от потока, владеющего этой областью.
UnsupportedOperationException - если этот сегмент не является отображённым сегментом памяти, например, если isMapped() == false.

load

void load()
Загружает содержимое этого отображённого сегмента в физическую память.

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

Throws:
IllegalStateException - если область, связанная с этим сегментом, была закрыта, или если доступ происходит из потока, отличного от потока, владеющего этой областью.
UnsupportedOperationException - если этот сегмент не является отображённым сегментом памяти, например, если isMapped() == false.

unload

void unload()
Выгружает содержимое этого отображённого сегмента из физической памяти.

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

Throws:
IllegalStateException - если область, связанная с этим сегментом, была закрыта, или если доступ происходит из потока, отличного от потока, владеющего этой областью.
UnsupportedOperationException - если этот сегмент не является отображённым сегментом памяти, например, если isMapped() == false.

force

void force()
Принудительно записывает все изменения, внесённые в содержимое этого отображённого сегмента, на устройство хранения, описанное дескриптором файла отображённого сегмента.

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

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

Если этот сегмент не был отображён в режиме чтения/записи (FileChannel.MapMode.READ_WRITE), то вызов этого метода может не иметь эффекта. В частности, метод не имеет эффекта для сегментов, отображённых в режимах только для чтения или частного отображения. Этот метод может или не может иметь эффект для режимов отображения, специфичных для реализации.

Throws:
IllegalStateException - если область, связанная с этим сегментом, была закрыта, или если доступ происходит из потока, отличного от потока, владеющего этой областью.
UnsupportedOperationException - если этот сегмент не является отображённым сегментом памяти, например, если isMapped() == false.
UncheckedIOException - если при записи содержимого этого сегмента на связанное устройство хранения произошла ошибка ввода-вывода

asByteBuffer

ByteBuffer asByteBuffer()
Оборачивает этот сегмент в ByteBuffer. Некоторые свойства возвращаемого буфера связаны со свойствами этого сегмента. Например, если этот сегмент является неизменяемым (например, сегмент является сегментом только для чтения, см. isReadOnly()), то возвращаемый буфер является только для чтения (см. Buffer.isReadOnly(). Кроме того, если это сегмент нативной памяти, возвращаемый буфер является прямым (см. ByteBuffer.isDirect()).

Позиция возвращаемого буфера (см. Buffer.position()) первоначально устанавливается в ноль, а ёмкость и предел возвращаемого буфера (см. Buffer.capacity() и Buffer.limit() соответственно) устанавливаются на размер этого сегмента (см. byteSize()). По этой причине буфер байтов не может быть возвращён, если размер этого сегмента больше Integer.MAX_VALUE.

Жизненный цикл возвращаемого буфера будет связан с жизненным циклом этого сегмента. То есть, доступ к возвращаемому буферу после закрытия области, связанной с этим сегментом (см. ResourceScope.close(), вызовет IllegalStateException.

Если этот сегмент связан с ограниченной областью, вызов операций ввода-вывода чтения/записи на результирующий буфер может привести к выбрасыванию неопределённого исключения. Примеры таких проблемных операций - AsynchronousSocketChannel.read(ByteBuffer) и AsynchronousSocketChannel.write(ByteBuffer).

Наконец, порядок байтов результирующего буфера - ByteOrder.BIG_ENDIAN; это можно изменить с помощью ByteBuffer.order(java.nio.ByteOrder).

Returns:
a ByteBuffer view of this memory segment.
Throws:
UnsupportedOperationException - если этот сегмент не может быть отображён в экземпляр ByteBuffer, например, потому что он моделирует сегмент на основе кучи, который не основан на byte[]), или если его размер больше Integer.MAX_VALUE.

toByteArray

byte[] toByteArray()
Копирует содержимое этого сегмента памяти в новый массив байтов.
Returns:
новый массив байтов, содержащий копию содержимого этого сегмента памяти.
Throws:
IllegalStateException - если область, связанная с этим сегментом, была закрыта, или если доступ происходит из потока, отличного от потока, владеющего этой областью, или если содержимое этого сегмента не может быть скопировано в экземпляр byte , например, его размер больше Integer.MAX_VALUE.

toShortArray

short[] toShortArray()
Копирует содержимое этого сегмента памяти в новый массив short.
Возвращает:
новый массив short, являющийся копией этого сегмента памяти.
Исключения:
IllegalStateException - если область, связанная с этим сегментом, закрыта, или если доступ осуществляется из потока, отличного от потока, владеющего этой областью, или если содержимое этого сегмента не может быть скопировано в short экземпляр, например, потому что byteSize() % 2 != 0, или byteSize() / 2 > Integer#MAX_VALUE

toCharArray

char[] toCharArray()
Копирует содержимое этого сегмента памяти в новый массив char.
Возвращает:
новый массив char, являющийся копией этого сегмента памяти.
Исключения:
IllegalStateException - если область, связанная с этим сегментом, закрыта, или если доступ осуществляется из потока, отличного от потока, владеющего этой областью, или если содержимое этого сегмента не может быть скопировано в char экземпляр, например, потому что byteSize() % 2 != 0, или byteSize() / 2 > Integer#MAX_VALUE.

toIntArray

int[] toIntArray()
Копирует содержимое этого сегмента памяти в новый массив int.
Возвращает:
новый массив int, являющийся копией этого сегмента памяти.
Исключения:
IllegalStateException - если область, связанная с этим сегментом, закрыта, или если доступ осуществляется из потока, отличного от потока, владеющего этой областью, или если содержимое этого сегмента не может быть скопировано в int экземпляр, например, потому что byteSize() % 4 != 0, или byteSize() / 4 > Integer#MAX_VALUE.

toFloatArray

float[] toFloatArray()
Копирует содержимое этого сегмента памяти в новый массив float.
Возвращает:
новый массив float, являющийся копией этого сегмента памяти.
Исключения:
IllegalStateException - если область, связанная с этим сегментом, закрыта, или если доступ осуществляется из потока, отличного от потока, владеющего этой областью, или если содержимое этого сегмента не может быть скопировано в float экземпляр, например, потому что byteSize() % 4 != 0, или byteSize() / 4 > Integer#MAX_VALUE.

toLongArray

long[] toLongArray()
Копирует содержимое этого сегмента памяти в новый массив long.
Возвращает:
новый массив long, являющийся копией этого сегмента памяти.
Исключения:
IllegalStateException - если область, связанная с этим сегментом, закрыта, или если доступ осуществляется из потока, отличного от потока, владеющего этой областью, или если содержимое этого сегмента не может быть скопировано в long экземпляр, например, потому что byteSize() % 8 != 0, или byteSize() / 8 > Integer#MAX_VALUE.

toDoubleArray

double[] toDoubleArray()
Копирует содержимое этого сегмента памяти в новый массив double.
Возвращает:
новый массив double, являющийся копией этого сегмента памяти.
Исключения:
IllegalStateException - если область, связанная с этим сегментом, закрыта, или если доступ осуществляется из потока, отличного от потока, владеющего этой областью, или если содержимое этого сегмента не может быть скопировано в double экземпляр, например, потому что byteSize() % 8 != 0, или byteSize() / 8 > Integer#MAX_VALUE.

ofByteBuffer

static MemorySegment ofByteBuffer(ByteBuffer bb)
Создаёт новый ограниченный сегмент буфера памяти, моделирующий память, связанную с заданным байтовым буфером. Сегмент начинается относительно позиции буфера (включительно) и заканчивается относительно предела буфера (исключительно).

Если буфер read-only, результирующий сегмент также будет read-only. Область, связанная с этим сегментом, может быть глобальной областью ресурсов global, если буфер был создан независимо, или какой-либо другой (возможно, закрываемой) областью ресурсов, если буфер был получен с помощью asByteBuffer().

Результирующий сегмент памяти хранит ссылку на буфер-источник, сохраняя его доступным.

Параметры:
bb - байтовый буфер, поддерживающий сегмент буфера памяти.
Возвращает:
новый сегмент буфера памяти.

ofArray

static MemorySegment ofArray(byte[] arr)
Создаёт новый ограниченный сегмент памяти массива, моделирующий память, связанную с заданным массивом байтов в куче. Область ресурсов возвращённого сегмента установлена в глобальную область ресурсов.
Параметры:
arr - примитивный массив, поддерживающий сегмент памяти массива.
Возвращает:
новый сегмент памяти массива.

ofArray

static MemorySegment ofArray(char[] arr)
Создаёт новый ограниченный сегмент памяти массива, моделирующий память, связанную с заданным массивом char в куче. Область ресурсов возвращённого сегмента установлена в глобальную область ресурсов.
Параметры:
arr - примитивный массив, поддерживающий сегмент памяти массива.
Возвращает:
новый сегмент памяти массива.

ofArray

static MemorySegment ofArray(short[] arr)
Создаёт новый ограниченный сегмент памяти массива, моделирующий память, связанную с заданным массивом short в куче. Область ресурсов возвращённого сегмента установлена в глобальную область ресурсов.
Параметры:
arr - примитивный массив, поддерживающий сегмент памяти массива.
Возвращает:
новый сегмент памяти массива.

ofArray

static MemorySegment ofArray(int[] arr)
Создаёт новый ограниченный сегмент памяти массива, моделирующий память, связанную с заданным массивом int в куче. Область ресурсов возвращённого сегмента установлена в глобальную область ресурсов.
Параметры:
arr - примитивный массив, поддерживающий сегмент памяти массива.
Возвращает:
новый сегмент памяти массива.

ofArray

static MemorySegment ofArray(float[] arr)
Создаёт новый ограниченный сегмент памяти массива, моделирующий память, связанную с заданным массивом float в куче. Область ресурсов возвращённого сегмента установлена в глобальную область ресурсов.
Параметры:
arr - примитивный массив, поддерживающий сегмент памяти массива.
Возвращает:
новый сегмент памяти массива.

ofArray

static MemorySegment ofArray(long[] arr)
Создаёт новый ограниченный сегмент памяти массива, моделирующий память, связанную с заданным массивом long в куче. Область ресурсов возвращённого сегмента установлена в глобальную область ресурсов.
Параметры:
arr - примитивный массив, поддерживающий сегмент памяти массива.
Возвращает:
новый сегмент памяти массива.

ofArray

static MemorySegment ofArray(double[] arr)
Создаёт новый ограниченный сегмент памяти массива, моделирующий память, связанную с заданным массивом double в куче. Область ресурсов возвращённого сегмента установлена в глобальную область ресурсов.
Параметры:
arr - примитивный массив, поддерживающий сегмент памяти массива.
Возвращает:
новый сегмент памяти массива.

allocateNative

static MemorySegment allocateNative(MemoryLayout layout, ResourceScope scope)
Создаёт новый ограниченный сегмент нативной памяти, моделирующий новый выделенный блок внекучевой памяти с заданной структурой и областью ресурсов. Клиент несёт ответственность за закрытие области ресурсов, связанной с возвращаемым сегментом, когда сегмент больше не используется. Отсутствие этого приведёт к утечкам внекучевой памяти.

Эквивалентно следующему коду:


    allocateNative(layout.bytesSize(), layout.bytesAlignment(), scope);
 

Блок внекучевой памяти, связанный с возвращаемым сегментом нативной памяти, инициализируется нулями.

Параметры:
layout - структура внекучевой памяти, поддерживающая сегмент нативной памяти.
scope - область видимости сегмента.
Возвращает:
новый сегмент нативной памяти.
Исключения:
IllegalArgumentException - если указанная структура имеет незаконные ограничения размера или выравнивания.
IllegalStateException - если scope уже закрыта, или если доступ осуществляется из потока, отличного от потока, владеющего scope.

allocateNative

static MemorySegment allocateNative(long bytesSize, ResourceScope scope)
Создаёт новый ограниченный сегмент нативной памяти, моделирующий новый выделенный блок внекучевой памяти с заданным размером (в байтах) и областью ресурсов. Клиент несёт ответственность за закрытие области ресурсов, связанной с возвращаемым сегментом, когда сегмент больше не используется. Отсутствие этого приведёт к утечкам внекучевой памяти.

Эквивалентно следующему коду:


    allocateNative(bytesSize, 1, scope);
 

Блок внекучевой памяти, связанный с возвращаемым сегментом нативной памяти, инициализируется нулями.

Параметры:
bytesSize - размер (в байтах) блока внекучевой памяти, поддерживающего сегмент нативной памяти.
scope - область видимости сегмента.
Возвращает:
новый сегмент нативной памяти.
Исключения:
IllegalArgumentException - если bytesSize <= 0.
IllegalStateException - если scope уже закрыта, или если доступ осуществляется из потока, отличного от потока, владеющего scope.

allocateNative

static MemorySegment allocateNative(long bytesSize, long alignmentBytes, ResourceScope scope)
Создаёт новый ограниченный сегмент нативной памяти, моделирующий только что выделенный блок памяти вне кучи заданного размера (в байтах), ограничения выравнивания (в байтах) и области ресурсов. Клиент несёт ответственность за закрытие области ресурсов, связанной с возвращённым сегментом, когда сегмент больше не используется. Отсутствие этого действия приведёт к утечкам памяти вне кучи.

Блок памяти вне кучи, связанный с возвращённым сегментом нативной памяти, инициализируется нулями.

Параметры:
bytesSize - размер (в байтах) блока памяти вне кучи, лежащего в основе сегмента нативной памяти.
alignmentBytes - ограничение выравнивания (в байтах) блока памяти вне кучи, лежащего в основе сегмента нативной памяти.
scope - область видимости сегмента.
Возвращает:
новый сегмент нативной памяти.
Исключения:
IllegalArgumentException - если bytesSize <= 0, alignmentBytes <= 0, или если alignmentBytes не является степенью двойки.
IllegalStateException - если scope уже закрыта, или если доступ происходит из потока, отличного от потока, владеющего scope.

mapFile

static MemorySegment mapFile(Path path, long bytesOffset, long bytesSize, FileChannel.MapMode mapMode, ResourceScope scope) throws IOException
Создаёт новый сегмент отображённой памяти, моделирующий область памяти, отображённую из файла по заданному пути.

Если указанный режим отображения — READ_ONLY, то получившийся сегмент будет только для чтения (см. isReadOnly()).

Содержимое сегмента отображённой памяти может изменяться в любое время, например, если содержимое соответствующей области отображённого файла изменится этой (или другой) программой. Происходят ли такие изменения и когда они происходят, зависит от операционной системы и поэтому не определено.

Весь или часть сегмента отображённой памяти может стать недоступным в любой момент, например, если отображённый файл усечён. Попытка доступа к недоступной области сегмента отображённой памяти не изменит содержимое сегмента и приведёт к выбросу неопределённого исключения либо в момент доступа, либо в какой-то момент позднее. Поэтому настоятельно рекомендуется принять соответствующие меры предосторожности, чтобы избежать манипулирования отображённым файлом этой (или другой) программой, за исключением чтения или записи содержимого файла.

Примечание реализации:
При получении отображённого сегмента из только что созданного файла начальное состояние содержимого блока отображённой памяти, связанного с возвращённым сегментом отображённой памяти, не определено и на него не следует полагаться.
Параметры:
path - путь к файлу для отображения в памяти.
bytesOffset - смещение (в байтах) в файле, с которого начинается отображённый сегмент.
bytesSize - размер (в байтах) отображённой памяти, лежащей в основе сегмента памяти.
mapMode - режим отображения файла, см. FileChannel.map(FileChannel.MapMode, long, long); выбранный режим отображения может повлиять на поведение возвращённого сегмента отображённой памяти (см. force()).
scope - область видимости сегмента.
Возвращает:
новый ограниченный сегмент отображённой памяти.
Исключения:
IllegalArgumentException - если bytesOffset < 0, bytesSize < 0, или если path не ассоциирован с файловой системой по умолчанию.
IllegalStateException - если scope уже закрыта, или если доступ происходит из потока, отличного от потока, владеющего scope.
UnsupportedOperationException - если указан неподдерживаемый режим отображения.
IOException - если указанный путь не указывает на существующий файл или произошла другая ошибка ввода-вывода.
SecurityException - Если установлен менеджер безопасности и он отказывается от указанного разрешения, необходимого для реализации. В случае поставщика по умолчанию вызывается метод SecurityManager.checkRead(String), чтобы проверить доступ для чтения, если файл открыт для чтения. Вызывается метод SecurityManager.checkWrite(String), чтобы проверить доступ для записи, если файл открыт для записи.

globalNativeSegment

static MemorySegment globalNativeSegment()
Возвращает сегмент нативной памяти, чьё базовое адрес равно MemoryAddress.NULL, а размер — Long.MAX_VALUE. Этот метод может быть очень полезен при разыменовании адресов памяти, полученных при взаимодействии с нативными библиотеками. Возвращаемый сегмент связан с глобальной областью ресурсов (см. ResourceScope.globalScope()). Эквивалентно (но, вероятно, эффективнее) следующему коду:

    MemoryAddress.NULL.asSegment(Long.MAX_VALUE)
 

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

Возвращает:
сегмент памяти, чьё базовое адрес равно MemoryAddress.NULL, а размер — Long.MAX_VALUE.
Исключения:
IllegalCallerException - если доступ к этому методу происходит из модуля M и опция командной строки --enable-native-access отсутствует или не упоминает имя модуля M, или ALL-UNNAMED в случае, если M является безымянным модулем.

© 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/MemorySegment.html

Spec-Zone.ru

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