Интерфейс 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 |
Создает новый ограниченный сегмент памяти, моделирующий только что выделенный блок памяти вне кучи заданного размера (в байтах), ограничения выравнивания (в байтах) и области ресурсов. |
static MemorySegment |
allocateNative |
Создает новый ограниченный сегмент памяти, моделирующий только что выделенный блок памяти вне кучи заданного размера (в байтах) и области ресурсов. |
static MemorySegment |
allocateNative |
Создает новый ограниченный сегмент памяти, моделирующий только что выделенный блок памяти вне кучи с заданной структурой и областью ресурсов. |
ByteBuffer |
asByteBuffer() |
Оборачивает этот сегмент в ByteBuffer. |
MemorySegment |
asReadOnly() |
Получает доступ в режиме только для чтения к этому сегменту. |
default MemorySegment |
asSlice |
Получает новый вид сегмента памяти, базовый адрес которого совпадает с базовым адресом этого сегмента плюс заданный смещение, а новый размер вычисляется путем вычитания заданного смещения из размера этого сегмента. |
MemorySegment |
asSlice |
Получает новый вид сегмента памяти, базовый адрес которого совпадает с базовым адресом этого сегмента плюс заданный смещение, а новый размер задается заданным аргументом. |
default MemorySegment |
asSlice |
Получает новый вид сегмента памяти, базовый адрес которого равен заданному адресу, а новый размер вычисляется путем вычитания смещения адреса относительно этого сегмента (см. MemoryAddress.segmentOffset(MemorySegment)) из размера этого сегмента. |
default MemorySegment |
asSlice |
Получает новый вид сегмента памяти, базовый адрес которого равен заданному адресу, а новый размер задается заданным аргументом. |
long |
byteSize() |
Размер (в байтах) этого сегмента памяти. |
void |
copyFrom |
Выполняет копирование данных из заданного исходного сегмента в этот сегмент. |
Stream<MemorySegment> |
elements |
Возвращает последовательный Stream по непересекающимся срезам (размер которых соответствует заданной структуре) в этом сегменте. |
MemorySegment |
fill |
Заполняет значение в этом сегменте памяти. |
void |
force() |
Принудительно записывает все изменения, внесенные в содержимое этого отображенного сегмента, на устройство хранения данных, описанное дескриптором файла отображенного сегмента. |
static MemorySegment |
globalNativeSegment() |
Возвращает сегмент нативной памяти, базовый адрес которого равен MemoryAddress.NULL, а размер равен Long.MAX_VALUE. |
boolean |
isLoaded() |
Указывает, присутствует ли содержимое этого отображенного сегмента в физической памяти. |
boolean |
isMapped() |
Является ли это отображенный сегмент? |
boolean |
isNative() |
Является ли этот сегмент сегментом нативной памяти? |
boolean |
isReadOnly() |
Является ли этот сегмент только для чтения? |
void |
load() |
Загружает содержимое этого отображенного сегмента в физическую память. |
static MemorySegment |
mapFile |
Создает новый отображенный сегмент памяти, который моделирует область памяти, сопоставленную с файлом из заданного пути. |
long |
mismatch |
Находит и возвращает смещение (в байтах) первой несовпадения между этим сегментом и заданным другим сегментом. |
static MemorySegment |
ofArray |
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом байтов, выделенным в куче. |
static MemorySegment |
ofArray |
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом символов, выделенным в куче. |
static MemorySegment |
ofArray |
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом double, выделенным в куче. |
static MemorySegment |
ofArray |
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом float, выделенным в куче. |
static MemorySegment |
ofArray |
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом int, выделенным в куче. |
static MemorySegment |
ofArray |
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом long, выделенным в куче. |
static MemorySegment |
ofArray |
Создает новый ограниченный массив сегмент памяти, который моделирует память, связанную с заданным массивом short, выделенным в куче. |
static MemorySegment |
ofByteBuffer |
Создает новый ограниченный сегмент памяти типа буфер, который моделирует память, связанную с заданным буфером byte. |
ResourceScope |
scope() |
Возвращает область ресурсов, связанную с этим сегментом памяти. |
Spliterator<MemorySegment> |
spliterator |
Возвращает итератор для этого сегмента памяти. |
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
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
default MemorySegment asSlice(long offset)
Эквивалентно следующему коду:
asSlice(offset, byteSize() - offset);
- Параметры:
-
offset- новое смещение базового сегмента (относительно текущего базового адреса сегмента), указанное в байтах. - Возвращает:
- новый вид сегмента памяти с обновлёнными адресами начала/конца.
- Исключение:
-
IndexOutOfBoundsException- еслиoffset < 0, илиoffset > byteSize(). - См. также:
asSlice
default MemorySegment asSlice(MemoryAddress newBase)
MemoryAddress.segmentOffset(MemorySegment)) из размера этого сегмента. Эквивалентно следующему коду:
asSlice(newBase.segmentOffset(this));
- Параметры:
-
newBase- новое смещение базового сегмента (относительно текущего базового адреса сегмента), указанное в байтах. - Возвращает:
- новый вид сегмента памяти с обновлёнными адресами начала/конца.
- Исключение:
-
IndexOutOfBoundsException- еслиaddress.segmentOffset(this) < 0, илиaddress.segmentOffset(this) > byteSize(). - См. также:
isReadOnly
boolean isReadOnly()
- Возвращает:
-
true, если этот сегмент только для чтения. - См. также:
asReadOnly
MemorySegment asReadOnly()
- Возвращает:
- представление только для чтения этого сегмента
- См. также:
isNative
boolean isNative()
allocateNative(long, ResourceScope) (и родственных) фабрик, или сегментом буфера, полученным из прямого ByteBuffer с помощью фабрики ofByteBuffer(ByteBuffer), или если это отображенный сегмент.- Возвращает:
-
trueесли этот сегмент является нативным сегментом.
isMapped
boolean isMapped()
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()).
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)
Если два сегмента имеют общий префикс, то возвращаемое смещение равно длине общего префикса, и отсюда следует, что несовпадение между двумя сегментами происходит в этом смещении в рамках соответствующих сегментов. Если один сегмент является собственным префиксом другого, то возвращаемое смещение равно меньшему из размеров сегментов, и отсюда следует, что смещение действительно только для большего сегмента. В противном случае несовпадения нет и возвращается
-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
ByteBufferview 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, являющийся копией этого сегмента памяти.
- Исключения:
-
IllegalStateException- если область, связанная с этим сегментом, закрыта, или если доступ осуществляется из потока, отличного от потока, владеющего этой областью, или если содержимое этого сегмента не может быть скопировано вshortэкземпляр, например, потому чтоbyteSize() % 2 != 0, илиbyteSize() / 2 > Integer#MAX_VALUE
toCharArray
char[] toCharArray()
- Возвращает:
- новый массив char, являющийся копией этого сегмента памяти.
- Исключения:
-
IllegalStateException- если область, связанная с этим сегментом, закрыта, или если доступ осуществляется из потока, отличного от потока, владеющего этой областью, или если содержимое этого сегмента не может быть скопировано вcharэкземпляр, например, потому чтоbyteSize() % 2 != 0, илиbyteSize() / 2 > Integer#MAX_VALUE.
toIntArray
int[] toIntArray()
- Возвращает:
- новый массив int, являющийся копией этого сегмента памяти.
- Исключения:
-
IllegalStateException- если область, связанная с этим сегментом, закрыта, или если доступ осуществляется из потока, отличного от потока, владеющего этой областью, или если содержимое этого сегмента не может быть скопировано вintэкземпляр, например, потому чтоbyteSize() % 4 != 0, илиbyteSize() / 4 > Integer#MAX_VALUE.
toFloatArray
float[] toFloatArray()
- Возвращает:
- новый массив float, являющийся копией этого сегмента памяти.
- Исключения:
-
IllegalStateException- если область, связанная с этим сегментом, закрыта, или если доступ осуществляется из потока, отличного от потока, владеющего этой областью, или если содержимое этого сегмента не может быть скопировано вfloatэкземпляр, например, потому чтоbyteSize() % 4 != 0, илиbyteSize() / 4 > Integer#MAX_VALUE.
toLongArray
long[] toLongArray()
- Возвращает:
- новый массив long, являющийся копией этого сегмента памяти.
- Исключения:
-
IllegalStateException- если область, связанная с этим сегментом, закрыта, или если доступ осуществляется из потока, отличного от потока, владеющего этой областью, или если содержимое этого сегмента не может быть скопировано вlongэкземпляр, например, потому чтоbyteSize() % 8 != 0, илиbyteSize() / 8 > Integer#MAX_VALUE.
toDoubleArray
double[] toDoubleArray()
- Возвращает:
- новый массив 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)
- Параметры:
-
arr- примитивный массив, поддерживающий сегмент памяти массива. - Возвращает:
- новый сегмент памяти массива.
ofArray
static MemorySegment ofArray(short[] arr)
- Параметры:
-
arr- примитивный массив, поддерживающий сегмент памяти массива. - Возвращает:
- новый сегмент памяти массива.
ofArray
static MemorySegment ofArray(int[] arr)
- Параметры:
-
arr- примитивный массив, поддерживающий сегмент памяти массива. - Возвращает:
- новый сегмент памяти массива.
ofArray
static MemorySegment ofArray(float[] arr)
- Параметры:
-
arr- примитивный массив, поддерживающий сегмент памяти массива. - Возвращает:
- новый сегмент памяти массива.
ofArray
static MemorySegment ofArray(long[] arr)
- Параметры:
-
arr- примитивный массив, поддерживающий сегмент памяти массива. - Возвращает:
- новый сегмент памяти массива.
ofArray
static MemorySegment ofArray(double[] arr)
- Параметры:
-
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