Интерфейс MemorySegment
public sealed interface MemorySegment
Существует два вида сегментов памяти:
- Сегмент кучи размещается в области памяти внутри кучи Java и обеспечивает доступ к ней (области «в куче»).
- Нативный сегмент размещается в области памяти вне кучи Java и обеспечивает доступ к ней (области «вне кучи»).
ofArray(int[]). Эти методы возвращают сегмент памяти, размещённый в области кучи, в которой находится указанный массив Java. Нативные сегменты можно получить, вызвав один из фабричных методов Arena.allocate(long, long), которые возвращают сегмент памяти, размещённый в новой области вне кучи, выделенной заданного размера и выровненной с учётом заданного ограничения на выравнивание. В качестве альтернативы нативные сегменты можно получить, mapping файл в новую область вне кучи (в некоторых системах эта операция иногда называется mmap). Полученные таким образом сегменты называются отображёнными, а их содержимое можно сохранять в файл и загружать из базового файла, отображённого в память.
Оба вида сегментов читаются и записываются с помощью одних и тех же методов, называемых операциями доступа. Операция доступа к сегменту памяти всегда обеспечивает доступ только к той области, для которой был получен сегмент.
Характеристики сегментов памяти
Каждый сегмент памяти имеет адрес, представленный значениемlong. Тип адреса сегмента зависит от его вида: - Адрес сегмента кучи не является физическим адресом, а представляет собой смещение внутри области памяти, в которой размещён сегмент. Эта область находится в куче Java, поэтому сборка мусора со временем может перемещать её в физической памяти, однако клиенты API
MemorySegment, получающие стабильный виртуализированный адрес сегмента кучи, размещённого в этой области, этого не замечают. Адрес сегмента кучи, полученного одним из фабричных методовofArray(int[]), равен нулю. - Адрес нативного сегмента (включая отображённые сегменты) обозначает физический адрес области памяти, в которой размещён сегмент.
Каждый сегмент памяти имеет максимальное выравнивание в байтах, представленное значением long. Максимальное выравнивание всегда является степенью двойки и определяется адресом сегмента и его типом, как подробнее описано ниже.
Каждый сегмент памяти имеет размер. Размер сегмента кучи определяется массивом Java, из которого он получен. Этот размер предсказуем для разных сред выполнения Java. Размер нативного сегмента либо задаётся явно (как в случае с Arena.allocate(long, long)), либо определяется по MemoryLayout (как в случае с SegmentAllocator.allocate(MemoryLayout)). Размер сегмента памяти обычно является положительным числом, но может быть равен нулю, однако никогда не бывает отрицательным.
Адрес и размер сегмента памяти совместно гарантируют, что операции доступа к сегменту не выйдут за пределы области памяти, в которой он размещён. Иными словами, у сегмента памяти есть пространственные границы.
Каждый сегмент памяти связан с областью действия. Благодаря этому операции доступа к сегменту памяти не могут выполняться, когда область памяти, в которой размещён сегмент, становится недоступной (например, после того как связанная с сегментом область действия перестаёт быть активной). Иными словами, у сегмента памяти есть временные границы.
Наконец, к операциям доступа к сегменту памяти могут применяться дополнительные проверки ограничения доступа по потокам. Доступ к сегментам кучи возможен из любого потока. Напротив, доступ к нативным сегментам возможен только с учётом характеристик ограничения доступа по потокам арены, использованной для их получения.
Доступ к сегментам памяти
Сегмент памяти можно читать и записывать с помощью различных операций доступа, предоставляемых этим классом (например,get(ValueLayout.OfInt, long)). Каждая операция доступа принимает раскладку значения value layout, задающую размер и форму значения, а также смещение, выраженное в байтах. Например, для чтения значения int из сегмента с использованием порядка байтов по умолчанию можно использовать следующий код: MemorySegment segment = ...
int value = segment.get(ValueLayout.JAVA_INT, 0);
int value = segment.get(ValueLayout.JAVA_INT.withOrder(BIG_ENDIAN), 0);
ValueLayout.varHandle() позволяет получить var handle, с помощью которого можно получать и задавать значения, представленные заданной раскладкой значения, в сегменте памяти по указанному смещению: VarHandle intAtOffsetHandle = ValueLayout.JAVA_INT.varHandle(); // (MemorySegment, long)
int value = (int) intAtOffsetHandle.get(segment, 10L); // segment.get(ValueLayout.JAVA_INT, 10L)
int по заданному логическому индексу можно создать следующим образом: VarHandle intAtOffsetAndIndexHandle =
ValueLayout.JAVA_INT.arrayElementVarHandle(); // (MemorySegment, long, long)
int value = (int) intAtOffsetAndIndexHandle.get(segment, 2L, 3L); // segment.get(ValueLayout.JAVA_INT, 2L + (3L * 4L))
Клиенты также могут опустить параметр базового смещения, чтобы упростить выражение доступа. Это можно использовать для реализации таких операций доступа, как getAtIndex(OfInt, long):
VarHandle intAtIndexHandle =
MethodHandles.insertCoordinates(intAtOffsetAndIndexHandle, 1, 0L); // (MemorySegment, long)
int value = (int) intAtIndexHandle.get(segment, 3L); // segment.getAtIndex(ValueLayout.JAVA_INT, 3L);
Создание срезов сегментов памяти
Сегменты памяти поддерживают создание срезов. Создание среза сегмента памяти возвращает новый сегмент памяти, размещённый в той же области памяти, что и исходный. Адрес сегмента-среза определяется адресом исходного сегмента путём прибавления смещения, выраженного в байтах. Размер сегмента-среза либо определяется неявно (путём вычитания заданного смещения из размера исходного сегмента), либо задаётся явно. Иными словами, пространственные границы сегмента-среза строже, чем у исходного сегмента: Arena arena = ...
MemorySegment segment = arena.allocate(100);
MemorySegment slice = segment.asSlice(50, 10);
slice.get(ValueLayout.JAVA_INT, 20); // Out of bounds!
arena.close();
slice.get(ValueLayout.JAVA_INT, 0); // Already closed!
segment и имеющий длину 10 байт. То есть адрес slice равен segment.address() + 50, а его размер равен 10. В результате попытка прочитать значение int по смещению 20 в сегменте slice приведёт к исключению. Временные границы исходного сегмента наследуются его срезами; то есть, когда связанная с segment область действия перестаёт быть активной, slice также становится недоступным. Клиент может получить из сегмента Stream, который затем можно использовать для создания срезов сегмента (в соответствии с заданной раскладкой элемента) и даже для параллельной работы нескольких потоков с непересекающимися срезами сегмента (для этого сегмент должен быть доступен из нескольких потоков). Следующий код можно использовать для параллельного суммирования всех значений int в сегменте памяти:
try (Arena arena = Arena.ofShared()) {
SequenceLayout SEQUENCE_LAYOUT = MemoryLayout.sequenceLayout(1024, ValueLayout.JAVA_INT);
MemorySegment segment = arena.allocate(SEQUENCE_LAYOUT);
int sum = segment.elements(ValueLayout.JAVA_INT).parallel()
.mapToInt(s -> s.get(ValueLayout.JAVA_INT, 0))
.sum();
}
Выравнивание
На операции доступа к сегменту памяти влияют не только пространственные и временные границы сегмента, но и ограничение на выравнивание раскладки значения, заданной для операции. Операция доступа может обращаться только к тем смещениям сегмента, которые обозначают адреса в физической памяти, выровненные согласно раскладке. Адрес в физической памяти выровнен согласно раскладке, если он кратен ограничению на выравнивание этой раскладки. Например, адрес 1000 выровнен согласно ограничению на выравнивание в 8 байт (поскольку 1000 кратно 8), а также согласно ограничениям на выравнивание в 4 и 2 байта; напротив, адрес 1004 выровнен согласно ограничениям на выравнивание в 4 и 2 байта, но не в 8 байт. Операции доступа должны соблюдать выравнивание, поскольку оно может влиять на производительность операций доступа, а также определять, какие операции доступа доступны по заданному физическому адресу. Например, атомарные операции доступа с использованиемVarHandle разрешены только по выровненным адресам. Кроме того, выравнивание учитывается для операций доступа независимо от того, к какому сегменту осуществляется доступ — нативному или сегменту кучи. Если доступ осуществляется к нативному сегменту, его адрес в физической памяти можно объединить со смещением, чтобы получить целевой адрес в физической памяти. Это показывает следующая псевдофункция:
boolean isAligned(MemorySegment segment, long offset, MemoryLayout layout) {
return ((segment.address() + offset) % layout.byteAlignment()) == 0;
}
- К нативному сегменту с адресом 1000 можно обращаться по смещениям 0, 8, 16, 24 и т. д. при ограничении на выравнивание в 8 байт, поскольку целевые адреса (1000, 1008, 1016, 1024) выровнены на 8 байт. Доступ по смещениям 1–7, 9–15 или 17–23 запрещён, поскольку целевые адреса не будут выровнены на 8 байт.
- К нативному сегменту с адресом 1000 можно обращаться по смещениям 0, 4, 8, 12 и т. д. при ограничении на выравнивание в 4 байта, поскольку целевые адреса (1000, 1004, 1008, 1012) выровнены на 4 байта. Доступ по смещениям 1–3, 5–7 или 9–11 запрещён, поскольку целевые адреса не будут выровнены на 4 байта.
- К нативному сегменту с адресом 1000 можно обращаться по смещениям 0, 2, 4, 6 и т. д. при ограничении на выравнивание в 2 байта, поскольку целевые адреса (1000, 1002, 1004, 1006) выровнены на 2 байта. Доступ по смещениям 1, 3 или 5 запрещён, поскольку целевые адреса не будут выровнены на 2 байта.
- К нативному сегменту с адресом 1004 можно обращаться по смещениям 0, 4, 8, 12 и т. д. при ограничении на выравнивание в 4 байта и по смещениям 0, 2, 4, 6 и т. д. при ограничении на выравнивание в 2 байта. При ограничении на выравнивание в 8 байт доступ возможен по смещениям 4, 12, 20, 28 и т. д.
- К нативному сегменту с адресом 1006 можно обращаться по смещениям 0, 2, 4, 6 и т. д. при ограничении на выравнивание в 2 байта. При ограничении на выравнивание в 4 байта доступ возможен по смещениям 2, 6, 10, 14 и т. д. При ограничении на выравнивание в 8 байт доступ возможен по смещениям 2, 10, 18, 26 и т. д.
- К нативному сегменту с адресом 1007 можно обращаться по смещениям 0, 1, 2, 3 и т. д. при ограничении на выравнивание в 1 байт. При ограничении на выравнивание в 2 байта доступ возможен по смещениям 1, 3, 5, 7 и т. д. При ограничении на выравнивание в 4 байта доступ возможен по смещениям 1, 5, 9, 13 и т. д. При ограничении на выравнивание в 8 байт доступ возможен по смещениям 1, 9, 17, 25 и т. д.
Ограничение на выравнивание, используемое при доступе к сегменту, обычно определяется формой структуры данных, хранящейся в сегменте. Например, если программист хочет хранить последовательность 8-байтовых значений в нативном сегменте, сегмент следует выделить с ограничением на выравнивание в 8 байт с помощью Arena.allocate(long, long) или SegmentAllocator.allocate(MemoryLayout). Эти фабричные методы гарантируют, что начальный адрес области памяти вне кучи, в которой размещён возвращаемый сегмент, будет выровнен на 8 байт. После этого программист может обращаться к сегменту по нужным смещениям — 0, 8, 16, 24 и т. д. — зная, что каждое такое обращение будет выровнено.
Если доступ осуществляется к сегменту кучи, определить, выровнен ли доступ, сложнее. Адрес сегмента в физической памяти неизвестен и даже не является постоянным (он может измениться при перемещении сегмента во время сборки мусора). Это означает, что адрес нельзя объединить с заданным смещением для определения целевого адреса в физической памяти. Поскольку ограничение на выравнивание всегда относится к выравниванию адресов в физической памяти, в принципе невозможно определить, выровнено ли какое-либо смещение в сегменте кучи. Например, предположим, что программист выбирает ограничение на выравнивание в 8 байт и пытается обратиться к смещению 16 в сегменте кучи. Если адресу 0 сегмента кучи соответствует физический адрес 1000, целевой адрес (1016) будет выровнен, но если адресу 0 соответствует физический адрес 1004, целевой адрес (1020) выровнен не будет. Нежелательно разрешать доступ к целевым адресам, которые выровнены согласно выбранному программистом ограничению на выравнивание, но при этом могут быть не гарантированно выровнены в физической памяти (например, из-за особенностей платформы и/или поведения сборщика мусора).
На практике среда выполнения Java размещает массивы в памяти так, чтобы каждый элемент размером n байт находился по физическому адресу, выровненному на n байт. Среда выполнения сохраняет этот инвариант, даже если массив перемещается во время сборки мусора. Операции доступа опираются на этот инвариант, чтобы определить, соответствует ли заданное смещение в сегменте кучи выровненному адресу в физической памяти. Например:
- Начальный физический адрес массива
short[]будет выровнен на 2 байта (например, 1006), чтобы следующие друг за другом элементы short находились по адресам, выровненным на 2 байта (например, 1006, 1008, 1010, 1012 и т. д.). К сегменту кучи, размещённому в массивеshort[], можно обращаться по смещениям 0, 2, 4, 6 и т. д. при ограничении на выравнивание в 2 байта. При ограничении на выравнивание в 4 байта обращаться к сегменту ни по одному смещению нельзя, поскольку нет гарантии, что целевой адрес будет выровнен на 4 байта: например, смещению 0 будет соответствовать физический адрес 1006, а смещению 1 — физический адрес 1007. Аналогично, при ограничении на выравнивание в 8 байт обращаться к сегменту нельзя ни по одному смещению, поскольку нет гарантии, что целевой адрес будет выровнен на 8 байт: например, смещению 2 будет соответствовать физический адрес 1008, а смещению 4 — физический адрес 1010. - Начальный физический адрес массива
long[]будет выровнен на 8 байт (например, 1000), чтобы следующие друг за другом элементы long находились по адресам, выровненным на 8 байт (например, 1000, 1008, 1016, 1024 и т. д.). К сегменту кучи, размещённому в массивеlong[], можно обращаться по смещениям 0, 8, 16, 24 и т. д. при ограничении на выравнивание в 8 байт. Кроме того, к сегменту можно обращаться по смещениям 0, 4, 8, 12 и т. д. при ограничении на выравнивание в 4 байта, поскольку целевые адреса (1000, 1004, 1008, 1012) выровнены на 4 байта. Также к сегменту можно обращаться по смещениям 0, 2, 4, 6 и т. д. при ограничении на выравнивание в 2 байта, поскольку целевые адреса (например, 1000, 1002, 1004, 1006) выровнены на 2 байта.
Иными словами, для сегментов кучи предусмотрено максимальное выравнивание, которое определяется размером элементов массива Java, в котором размещён сегмент, как показано в следующей таблице:
К сегментам кучи можно обращаться только с помощью раскладки, выравнивание которой меньше или равно максимальному выравниванию, связанному с сегментом кучи. Попытка обратиться к сегменту кучи с помощью раскладки, выравнивание которой превышает максимальное выравнивание сегмента, завершится ошибкой, как показано в следующем примере:
Тип массива (области размещения) Максимальное поддерживаемое выравнивание (в байтах) boolean[]ValueLayout.JAVA_BOOLEAN.byteAlignment()byte[]ValueLayout.JAVA_BYTE.byteAlignment()char[]ValueLayout.JAVA_CHAR.byteAlignment()short[]ValueLayout.JAVA_SHORT.byteAlignment()int[]ValueLayout.JAVA_INT.byteAlignment()float[]ValueLayout.JAVA_FLOAT.byteAlignment()long[]ValueLayout.JAVA_LONG.byteAlignment()double[]ValueLayout.JAVA_DOUBLE.byteAlignment()
MemorySegment byteSegment = MemorySegment.ofArray(new byte[10]);
byteSegment.get(ValueLayout.JAVA_INT, 0); // fails: ValueLayout.JAVA_INT.byteAlignment() > ValueLayout.JAVA_BYTE.byteAlignment()
long[]), который поддерживает большее максимальное выравнивание. В частности, максимальное выравнивание, связанное с long[], равно ValueLayout.JAVA_LONG.byteAlignment(), то есть 8 байтам: MemorySegment longSegment = MemorySegment.ofArray(new long[10]);
longSegment.get(ValueLayout.JAVA_INT, 0); // ok: ValueLayout.JAVA_INT.byteAlignment() <= ValueLayout.JAVA_LONG.byteAlignment()
ValueLayout.JAVA_INT_UNALIGNED) ограничение на выравнивание установлено равным 1: MemorySegment byteSegment = MemorySegment.ofArray(new byte[10]);
byteSegment.get(ValueLayout.JAVA_INT_UNALIGNED, 0); // ok: ValueLayout.JAVA_INT_UNALIGNED.byteAlignment() == ValueLayout.JAVA_BYTE.byteAlignment()
MemoryLayout layout = ...
MemorySegment segment = ...
boolean isAligned = segment.maxByteAlignment() >= layout.byteAlignment();
Сегменты памяти нулевой длины
При взаимодействии с внешними функциями часто возникает ситуация, когда такие функции выделяют область памяти и возвращают указатель на неё. Смоделировать эту область памяти с помощью сегмента памяти непросто, поскольку среда выполнения Java не располагает сведениями о размере области. Доступен только адрес начала области, хранящийся в указателе. Например, функция C с типом возвращаемого значенияchar* может вернуть указатель на область, содержащую одно значение char, или на область, содержащую массив значений char, размер которого может передаваться отдельным параметром. Код, вызывающий внешнюю функцию и рассчитывающий использовать результат, не может напрямую определить размер массива. Помимо отсутствия сведений о размере области памяти, на которую указывает указатель, возвращённый внешней функцией, у такого кода нет и сведений о времени жизни этой области, предусмотренном внешней функцией, которая её выделила. API MemorySegment использует сегменты памяти нулевой длины для представления:
- указателей, возвращённых внешней функцией;
- указателей, переданных внешней функцией заглушке обратного вызова; и
- указателей, прочитанных из сегмента памяти (подробнее об этом ниже).
- Размер сегмента равен нулю. Любая попытка обратиться к этим сегментам завершится исключением
IndexOutOfBoundsException. Это важная функция безопасности: поскольку эти сегменты связаны с областью памяти неизвестного размера, проверить любые операции доступа с их участием невозможно. По сути, сегмент памяти нулевой длины оборачивает адрес, и использовать его без явного намерения нельзя (см. ниже); - Сегмент связан с глобальной областью действия. Поэтому сегменты памяти нулевой длины нельзя использовать для прямого доступа, но их можно непрозрачно передавать другим внешним функциям, принимающим указатели.
Чтобы показать, как клиенты могут работать с сегментами памяти нулевой длины, рассмотрим случай, когда клиент хочет прочитать указатель из некоторого сегмента памяти. Это можно сделать с помощью метода доступа get(AddressLayout, long). Этот метод принимает раскладку адреса address layout (например, ValueLayout.ADDRESS) — раскладку указателя, который нужно прочитать. Например, на 64-разрядной платформе размер раскладки адреса равен 8 байтам. Операция доступа также принимает смещение, выраженное в байтах, которое указывает позицию (относительно начала сегмента памяти), в которой хранится указатель. Операция доступа возвращает нативный сегмент памяти нулевой длины, размещённый в области памяти, начальный адрес которой равен 64-разрядному значению, прочитанному по указанному смещению.
Клиент не может напрямую обращаться к возвращённому сегменту памяти нулевой длины: поскольку размер сегмента равен нулю, любая операция доступа приведёт к выходу за границы. Вместо этого клиент должен небезопасно задать сегменту памяти нулевой длины новые пространственные границы. Это можно сделать с помощью метода reinterpret(long)RESTRICTED следующим образом:
MemorySegment z = segment.get(ValueLayout.ADDRESS, ...); // size = 0
MemorySegment ptr = z.reinterpret(16); // size = 16
int x = ptr.getAtIndex(ValueLayout.JAVA_INT, 3); // ok
В некоторых случаях клиенту может также понадобиться задать сегменту памяти нулевой длины новые временные границы. Это можно сделать с помощью метода reinterpret(long, Arena, Consumer)RESTRICTED, который возвращает новый нативный сегмент заданного размера с теми же временными границами, что и у указанной арены:
MemorySegment ptr = null;
try (Arena arena = Arena.ofConfined()) {
MemorySegment z = segment.get(ValueLayout.ADDRESS, ...); // size = 0, scope = always alive
ptr = z.reinterpret(16, arena, null); // size = 16, scope = arena.scope()
int x = ptr.getAtIndex(ValueLayout.JAVA_INT, 3); // ok
}
int x = ptr.getAtIndex(ValueLayout.JAVA_INT, 3); // throws IllegalStateException
AddressLayout intArrPtrLayout = ValueLayout.ADDRESS.withTargetLayout(
MemoryLayout.sequenceLayout(4, ValueLayout.JAVA_INT)); // layout for int (*ptr)[4]
MemorySegment ptr = segment.get(intArrPtrLayout, ...); // size = 16
int x = ptr.getAtIndex(ValueLayout.JAVA_INT, 3); // ok
Все методы, предназначенные для работы с сегментами памяти нулевой длины (reinterpret(long)RESTRICTED, reinterpret(Arena, Consumer)RESTRICTED, reinterpret(long, Arena, Consumer)RESTRICTED и AddressLayout.withTargetLayout(MemoryLayout)RESTRICTED) являются методами с ограниченным доступом и должны использоваться с осторожностью: назначение сегменту неверных пространственных и/или временных границ может привести к сбою виртуальной машины при попытке доступа к сегменту памяти.
- Требования к реализации:
- Реализации этого интерфейса неизменяемы, потокобезопасны и основаны на значениях.
- Начиная с версии:
- 22
Краткое описание вложенных классов
| Модификатор и тип | Интерфейс | Описание |
|---|---|---|
static interface |
MemorySegment.Scope |
Область действия моделирует время жизни всех связанных с ней сегментов памяти. |
Краткое описание полей
| Модификатор и тип | Поле | Описание |
|---|---|---|
static final MemorySegment |
NULL |
Нативный сегмент нулевой длины, моделирующий адрес NULL. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
long |
address() |
Возвращает адрес этого сегмента памяти. |
ByteBuffer |
asByteBuffer() |
Оборачивает этот сегмент в ByteBuffer. |
Optional |
asOverlappingSlice |
Возвращает срез этого сегмента, представляющий пересечение этого сегмента и предоставленного сегмента. |
MemorySegment |
asReadOnly() |
Возвращает доступное только для чтения представление этого сегмента. |
MemorySegment |
asSlice |
Возвращает срез этого сегмента памяти, начиная с указанного смещения. |
MemorySegment |
asSlice |
Возвращает срез этого сегмента памяти, начиная с указанного смещения. |
MemorySegment |
asSlice |
Возвращает срез этого сегмента памяти, начиная с указанного смещения и с заданным ограничением на выравнивание. |
MemorySegment |
asSlice |
Возвращает срез этого сегмента памяти с указанным макетом, начиная с заданного смещения. |
long |
byteSize() |
Возвращает размер этого сегмента памяти (в байтах). |
static void |
copy |
Выполняет массовое копирование из исходного сегмента в целевой сегмент. |
static void |
copy |
Выполняет массовое копирование из исходного сегмента в целевой сегмент. |
static void |
copy |
Копирует указанное количество элементов из исходного сегмента памяти в целевой массив. |
static void |
copy |
Копирует указанное количество элементов из исходного массива в целевой сегмент памяти. |
static long |
copy |
Копирует в целевой сегмент последовательность байтов заданной строки, закодированной с использованием предоставленной кодировки. |
MemorySegment |
copyFrom |
Выполняет массовое копирование из указанного исходного сегмента в этот сегмент. |
Stream |
elements |
Возвращает последовательный Stream для непересекающихся срезов этого сегмента (размер каждого среза соответствует размеру указанного макета). |
boolean |
equals |
Сравнивает указанный объект с этим сегментом памяти на равенство. |
MemorySegment |
fill |
Заполняет содержимое этого сегмента памяти заданным значением. |
void |
force() |
Принудительно записывает все изменения содержимого этого отображённого сегмента на устройство хранения, указанное файловым дескриптором сегмента. |
MemorySegment |
get |
Считывает адрес из этого сегмента по указанному смещению с использованием заданного макета. |
boolean |
get |
Считывает значение boolean из этого сегмента по указанному смещению с использованием заданного макета. |
byte |
get |
Считывает значение byte из этого сегмента по указанному смещению с использованием заданного макета. |
char |
get |
Считывает значение char из этого сегмента по указанному смещению с использованием заданного макета. |
double |
get |
Считывает значение double из этого сегмента по указанному смещению с использованием заданного макета. |
float |
get |
Считывает значение float из этого сегмента по указанному смещению с использованием заданного макета. |
int |
get |
Считывает значение int из этого сегмента по указанному смещению с использованием заданного макета. |
long |
get |
Считывает значение long из этого сегмента по указанному смещению с использованием заданного макета. |
short |
get |
Считывает значение short из этого сегмента по указанному смещению с использованием заданного макета. |
MemorySegment |
getAtIndex |
Считывает адрес из этого сегмента по указанному индексу, умноженному на размер заданного макета. |
boolean |
getAtIndex |
Считывает значение boolean из этого сегмента по указанному индексу, умноженному на размер заданного макета. |
byte |
getAtIndex |
Считывает значение byte из этого сегмента по указанному индексу, умноженному на размер заданного макета. |
char |
getAtIndex |
Считывает значение char из этого сегмента по указанному индексу, умноженному на размер заданного макета. |
double |
getAtIndex |
Считывает значение double из этого сегмента по указанному индексу, умноженному на размер заданного макета. |
float |
getAtIndex |
Считывает значение float из этого сегмента по указанному индексу, умноженному на размер заданного макета. |
int |
getAtIndex |
Считывает значение int из этого сегмента по указанному индексу, умноженному на размер заданного макета. |
long |
getAtIndex |
Считывает значение long из этого сегмента по указанному индексу, умноженному на размер заданного макета. |
short |
getAtIndex |
Считывает значение short из этого сегмента по указанному индексу, умноженному на размер заданного макета. |
String |
getString |
Считывает из этого сегмента строку, завершающуюся нулевым байтом, начиная с указанного смещения и используя кодировку UTF-8. |
String |
getString |
Считывает из этого сегмента строку, завершающуюся нулевым байтом, начиная с указанного смещения и используя предоставленную кодировку. |
String |
getString |
Считывает строку из этого сегмента по указанному смещению, используя заданную длину и кодировку. |
int |
hashCode() |
Возвращает хеш-код этого сегмента памяти. |
Optional |
heapBase() |
Возвращает объект Java, хранящийся в области памяти кучи, на которой основан этот сегмент памяти, если такой объект существует. |
boolean |
isAccessibleBy |
Возвращает true, если предоставленный поток может обращаться к этому сегменту. |
boolean |
isLoaded() |
Определяет, находится ли всё содержимое этого отображённого сегмента в физической памяти. |
boolean |
isMapped() |
Возвращает true, если этот сегмент является отображённым. |
boolean |
isNative() |
Возвращает true, если этот сегмент является нативным. |
boolean |
isReadOnly() |
Возвращает true, если этот сегмент доступен только для чтения. |
void |
load() |
Загружает содержимое этого отображённого сегмента в физическую память. |
long |
maxByteAlignment() |
Возвращает максимальное выравнивание по байтам, связанное с этим сегментом памяти. |
long |
mismatch |
Находит и возвращает смещение в байтах первого несовпадения между этим сегментом и указанным другим сегментом. |
static long |
mismatch |
Находит и возвращает относительное смещение в байтах первого несовпадения между исходным и целевым сегментами. |
static MemorySegment |
ofAddress |
Создаёт нативный сегмент нулевой длины из указанного значения адреса. |
static MemorySegment |
ofArray |
Создаёт сегмент кучи на основе области памяти в куче, в которой хранится указанный массив byte. |
static MemorySegment |
ofArray |
Создаёт сегмент кучи на основе области памяти в куче, в которой хранится указанный массив char. |
static MemorySegment |
ofArray |
Создаёт сегмент кучи на основе области памяти в куче, в которой хранится указанный массив double. |
static MemorySegment |
ofArray |
Создаёт сегмент кучи на основе области памяти в куче, в которой хранится указанный массив float. |
static MemorySegment |
ofArray |
Создаёт сегмент кучи на основе области памяти в куче, в которой хранится указанный массив int. |
static MemorySegment |
ofArray |
Создаёт сегмент кучи на основе области памяти в куче, в которой хранится указанный массив long. |
static MemorySegment |
ofArray |
Создаёт сегмент кучи на основе области памяти в куче, в которой хранится указанный массив short. |
static MemorySegment |
ofBuffer |
Создаёт сегмент памяти на основе той же области памяти, на которой основан указанный экземпляр Buffer. |
MemorySegment |
reinterpret |
Ограниченный доступ. Возвращает новый сегмент памяти с теми же адресом и областью действия, что и у этого сегмента, но с указанным размером. |
MemorySegment |
reinterpret |
Ограниченный доступ. Возвращает новый сегмент с тем же адресом, что и у этого сегмента, но с указанным размером и областью действия предоставленной арены. |
MemorySegment |
reinterpret |
Ограниченный доступ. Возвращает новый сегмент памяти с теми же адресом и размером, что и у этого сегмента, но с областью действия предоставленной арены. |
MemorySegment.Scope |
scope() |
Возвращает область действия, связанную с этим сегментом памяти. |
void |
set |
Записывает адрес в этот сегмент по указанному смещению с использованием заданного макета. |
void |
set |
Записывает значение boolean в этот сегмент по указанному смещению с использованием заданного макета. |
void |
set |
Записывает значение byte в этот сегмент по указанному смещению с использованием заданного макета. |
void |
set |
Записывает значение char в этот сегмент по указанному смещению с использованием заданного макета. |
void |
set |
Записывает значение double в этот сегмент по указанному смещению с использованием заданного макета. |
void |
set |
Записывает значение float в этот сегмент по указанному смещению с использованием заданного макета. |
void |
set |
Записывает значение int в этот сегмент по указанному смещению с использованием заданного макета. |
void |
set |
Записывает значение long в этот сегмент по указанному смещению с использованием заданного макета. |
void |
set |
Записывает значение short в этот сегмент по указанному смещению с использованием заданного макета. |
void |
setAtIndex |
Записывает адрес в этот сегмент по указанному индексу, умноженному на размер заданного макета. |
void |
setAtIndex |
Записывает значение boolean в этот сегмент по указанному индексу, умноженному на размер заданного макета. |
void |
setAtIndex |
Записывает значение byte в этот сегмент по указанному индексу, умноженному на размер заданного макета. |
void |
setAtIndex |
Записывает значение char в этот сегмент по указанному индексу, умноженному на размер заданного макета. |
void |
setAtIndex |
Записывает значение double в этот сегмент по указанному индексу, умноженному на размер заданного макета. |
void |
setAtIndex |
Записывает значение float в этот сегмент по указанному индексу, умноженному на размер заданного макета. |
void |
setAtIndex |
Записывает значение int в этот сегмент по указанному индексу, умноженному на размер заданного макета. |
void |
setAtIndex |
Записывает значение long в этот сегмент по указанному индексу, умноженному на размер заданного макета. |
void |
setAtIndex |
Записывает значение short в этот сегмент по указанному индексу, умноженному на размер заданного макета. |
void |
setString |
Записывает указанную строку в этот сегмент по заданному смещению, преобразуя её в последовательность байтов, завершающуюся нулевым байтом, с использованием кодировки UTF-8. |
void |
setString |
Записывает указанную строку в этот сегмент по заданному смещению, преобразуя её в последовательность байтов, завершающуюся нулевым байтом, с использованием предоставленной кодировки. |
Spliterator |
spliterator |
Возвращает сплитератор для этого сегмента памяти. |
byte[] |
toArray |
Копирует содержимое этого сегмента памяти в новый массив byte. |
char[] |
toArray |
Копирует содержимое этого сегмента памяти в новый массив char. |
double[] |
toArray |
Копирует содержимое этого сегмента памяти в новый массив double. |
float[] |
toArray |
Копирует содержимое этого сегмента памяти в новый массив float. |
int[] |
toArray |
Копирует содержимое этого сегмента памяти в новый массив int. |
long[] |
toArray |
Копирует содержимое этого сегмента памяти в новый массив long. |
short[] |
toArray |
Копирует содержимое этого сегмента памяти в новый массив short. |
void |
unload() |
Выгружает содержимое этого отображённого сегмента из физической памяти. |
Подробное описание полей
NULL
static final MemorySegment NULL
NULL. Эквивалентен MemorySegment.ofAddress(0L). Максимальное выравнивание по байтам для сегмента NULL составляет 262.
- Примечание API:
- Клиентам следует избегать использования
==для сравнения сегмента сMemorySegment.NULL. Сегмент с адресом0Lможет быть создан независимо и поэтому может иметь другую идентичность.
Подробное описание методов
address
long address()
- Примечание API:
- При использовании этого метода для передачи адреса сегмента во внешнюю операцию (например, функцию JNI) клиентам необходимо убедиться, что сегмент остается достижимым в течение всей операции. В противном случае область памяти, лежащая в основе сегмента памяти, может быть освобождена преждевременно, если сегмент был выделен в автоматической арене.
- Возвращает:
- адрес этого сегмента памяти
heapBase
Optional<Object> heapBase()
ofArray(byte[]), этот метод вернет объект byte[], использованный для получения сегмента. Этот метод возвращает пустое значение Optional, если сегмент является нативным или доступен только для чтения.- Возвращает:
- объект Java, связанный с этим сегментом памяти, если такой есть
spliterator
Spliterator<MemorySegment> spliterator(MemoryLayout elementLayout)
Spliterator.SIZED, Spliterator.SUBSIZED, Spliterator.IMMUTABLE, Spliterator.NONNULL и Spliterator.ORDERED. Возвращаемый сплитератор разделяет этот сегмент в соответствии с указанной раскладкой элементов; то есть, если размер переданной раскладки равен N, вызов Spliterator.trySplit() приведет к тому, что каждый сплитератор будет обслуживать приблизительно S/N элементов (в зависимости от того, четное ли N), где S — размер этого сегмента. Таким образом, разделение возможно, пока выполняется S/N >= 2. Сплитератор возвращает сегменты с тем же временем жизни, что и у этого сегмента.
Возвращаемый сплитератор позволяет разделить этот сегмент на непересекающиеся срезы, которые затем можно обрабатывать параллельно в нескольких потоках.
- Параметры:
-
elementLayout— раскладка, используемая для разделения - Возвращает:
- сплитератор элементов для этого сегмента
- Исключения:
-
IllegalArgumentException— еслиelementLayout.byteSize() == 0 -
IllegalArgumentException— еслиbyteSize() % elementLayout.byteSize() != 0 -
IllegalArgumentException— еслиelementLayout.byteSize() % elementLayout.byteAlignment() != 0 -
IllegalArgumentException— если этот сегмент несовместим с ограничением выравнивания в предоставленной раскладке.
elements
Stream<MemorySegment> elements(MemoryLayout elementLayout)
Stream по непересекающимся срезам (размер которых соответствует размеру указанной раскладки) этого сегмента. Вызов этого метода эквивалентен следующему коду: StreamSupport.stream(segment.spliterator(elementLayout), false);
- Параметры:
-
elementLayout— раскладка, используемая для разделения - Возвращает:
- последовательный
Streamпо непересекающимся срезам этого сегмента - Исключения:
-
IllegalArgumentException— еслиelementLayout.byteSize() == 0 -
IllegalArgumentException— еслиbyteSize() % elementLayout.byteSize() != 0 -
IllegalArgumentException— еслиelementLayout.byteSize() % elementLayout.byteAlignment() != 0 -
IllegalArgumentException— если этот сегмент несовместим с ограничением выравнивания в предоставленной раскладке
scope
MemorySegment.Scope scope()
- Возвращает:
- область действия, связанную с этим сегментом памяти
isAccessibleBy
boolean isAccessibleBy(Thread thread)
true, если к этому сегменту можно получить доступ из указанного потока.- Параметры:
-
thread— поток, который необходимо проверить - Возвращает:
-
true, если к этому сегменту можно получить доступ из указанного потока
byteSize
long byteSize()
- Возвращает:
- размер этого сегмента памяти в байтах
maxByteAlignment
long maxByteAlignment()
Возвращаемое выравнивание всегда является степенью двойки и определяется на основе адреса сегмента и, если это сегмент кучи, типа хранилища в куче, лежащего в его основе.
Этот метод можно использовать, чтобы убедиться, что сегмент достаточно выровнен относительно раскладки:
MemoryLayout layout = ...
MemorySegment segment = ...
if (segment.maxByteAlignment() < layout.byteAlignment()) {
// Take action (e.g. throw an Exception)
}
- Возвращает:
- максимальное выравнивание по байтам, связанное с этим сегментом памяти
- Начиная с:
- 23
asSlice
MemorySegment asSlice(long offset, long newSize)
Эквивалентно следующему коду:
asSlice(offset, newSize, 1);
Если этот сегмент доступен только для чтения, возвращаемый сегмент также будет доступен только для чтения.
Возвращаемый сегмент памяти использует общую с этим сегментом область базовой памяти. Следовательно, этот метод не выделяет и не освобождает память.
- Параметры:
-
offset— новое базовое смещение сегмента относительно адреса этого сегмента, заданное в байтах -
newSize— новый размер сегмента, заданный в байтах - Возвращает:
- срез этого сегмента памяти
- Исключения:
-
IndexOutOfBoundsException— еслиoffset < 0,offset > byteSize(),newSize < 0илиnewSize > byteSize() - offset - См. также:
asSlice
MemorySegment asSlice(long offset, long newSize, long byteAlignment)
Если этот сегмент доступен только для чтения, возвращаемый сегмент также будет доступен только для чтения.
Возвращаемый сегмент памяти использует общую с этим сегментом область базовой памяти. Следовательно, этот метод не выделяет и не освобождает память.
- Параметры:
-
offset— новое базовое смещение сегмента относительно адреса этого сегмента, заданное в байтах -
newSize— новый размер сегмента, заданный в байтах -
byteAlignment— ограничение выравнивания возвращаемого среза в байтах - Возвращает:
- срез этого сегмента памяти
- Исключения:
-
IndexOutOfBoundsException— еслиoffset < 0,offset > byteSize(),newSize < 0илиnewSize > byteSize() - offset -
IllegalArgumentException— если к этому сегменту нельзя получить доступ по адресуoffsetпри заданном ограничении выравнивания -
IllegalArgumentException— еслиbyteAlignment <= 0илиbyteAlignmentне является степенью двойки
asSlice
MemorySegment asSlice(long offset, MemoryLayout layout)
Эквивалентно следующему коду:
asSlice(offset, layout.byteSize(), layout.byteAlignment());
Если этот сегмент доступен только для чтения, возвращаемый сегмент также будет доступен только для чтения.
Возвращаемый сегмент памяти использует общую с этим сегментом область базовой памяти. Следовательно, этот метод не выделяет и не освобождает память.
- Параметры:
-
offset— новое базовое смещение сегмента относительно адреса этого сегмента, заданное в байтах -
layout— раскладка среза сегмента - Возвращает:
- срез этого сегмента памяти
- Исключения:
-
IndexOutOfBoundsException— еслиoffset < 0,offset > byteSize()илиlayout.byteSize() > byteSize() - offset -
IllegalArgumentException— если к этому сегменту нельзя получить доступ по адресуoffsetпри ограничении выравнивания, заданном вlayout - См. также:
asSlice
MemorySegment asSlice(long offset)
Эквивалентно следующему коду:
asSlice(offset, byteSize() - offset);
Если этот сегмент доступен только для чтения, возвращаемый сегмент также будет доступен только для чтения.
Возвращаемый сегмент памяти использует общую с этим сегментом область базовой памяти. Следовательно, этот метод не выделяет и не освобождает память.
- Параметры:
-
offset— новое базовое смещение сегмента относительно адреса этого сегмента, заданное в байтах - Возвращает:
- срез этого сегмента памяти
- Исключения:
-
IndexOutOfBoundsException— еслиoffset < 0илиoffset > byteSize() - См. также:
reinterpret
MemorySegment reinterpret(long newSize)
reinterpret — это ограниченный метод платформы Java. Если этот сегмент доступен только для чтения, возвращаемый сегмент также будет доступен только для чтения.
Возвращаемый сегмент памяти использует общую с этим сегментом область базовой памяти. Следовательно, этот метод не выделяет и не освобождает память.
- Параметры:
-
newSize— размер возвращаемого сегмента - Возвращает:
- новый сегмент памяти с теми же адресом и областью действия, что и у этого сегмента, но с указанным новым размером
- Исключения:
-
IllegalArgumentException— еслиnewSize < 0 -
UnsupportedOperationException— если этот сегмент не является нативным -
IllegalCallerException— если вызывающий код находится в модуле, для которого не включен нативный доступ
reinterpret
MemorySegment reinterpret(Arena arena, Consumer<MemorySegment> cleanup)
reinterpret — это ограниченный метод платформы Java. reinterpret только при включенном доступе к ограниченным методам.Клиенты могут указать необязательное действие очистки, которое должно быть выполнено при аннулировании области действия предоставленной арены. Это действие очистки получает новый сегмент памяти, полученный из этого сегмента следующим образом:
MemorySegment cleanupSegment = MemorySegment.ofAddress(this.address())
.reinterpret(byteSize());
byteSize(). Если этот сегмент доступен только для чтения, возвращаемый сегмент также будет доступен только для чтения.
Возвращаемый сегмент памяти использует общую с этим сегментом область базовой памяти. Следовательно, этот метод не выделяет и не освобождает память.
- Примечание API:
- Действие очистки (если оно задано) должно следить за тем, чтобы не передавать полученный сегмент внешним клиентам, которые могут обратиться к нему после того, как его базовая область памяти станет недоступна. Кроме того, если предоставленная арена является автоматической ареной, действие очистки не должно препятствовать переходу арены в состояние недостижимости. В противном случае области памяти, выделенные автоматической ареной, не будут освобождены.
- Параметры:
-
arena— арена, с которой будет связан возвращаемый сегмент -
cleanup— действие очистки, которое следует выполнить при закрытии предоставленной арены (может бытьnull) - Возвращает:
- новый сегмент памяти с неограниченным размером
- Исключения:
-
IllegalStateException— еслиarena.scope().isAlive() == false -
UnsupportedOperationException— если этот сегмент не является нативным -
IllegalCallerException— если вызывающий код находится в модуле, для которого не включен нативный доступ
reinterpret
MemorySegment reinterpret(long newSize, Arena arena, Consumer<MemorySegment> cleanup)
reinterpret — это ограниченный метод платформы Java. reinterpret только при включенном доступе к ограниченным методам.Клиенты могут указать необязательное действие очистки, которое должно быть выполнено при аннулировании области действия предоставленной арены. Это действие очистки получает новый сегмент памяти, полученный из этого сегмента следующим образом:
MemorySegment cleanupSegment = MemorySegment.ofAddress(this.address())
.reinterpret(newSize);
newSize. Если этот сегмент доступен только для чтения, возвращаемый сегмент также будет доступен только для чтения.
Возвращаемый сегмент памяти использует общую с этим сегментом область базовой памяти. Следовательно, этот метод не выделяет и не освобождает память.
- Примечание API:
- Действие очистки (если оно задано) должно следить за тем, чтобы не передавать полученный сегмент внешним клиентам, которые могут обратиться к нему после того, как его базовая область памяти станет недоступна. Кроме того, если предоставленная арена является автоматической ареной, действие очистки не должно препятствовать переходу арены в состояние недостижимости. В противном случае области памяти, выделенные автоматической ареной, не будут освобождены.
- Параметры:
-
newSize— размер возвращаемого сегмента -
arena— арена, с которой будет связан возвращаемый сегмент -
cleanup— действие очистки, которое следует выполнить при закрытии предоставленной арены (может бытьnull). - Возвращает:
- новый сегмент с тем же адресом, что и у этого сегмента, но с новым размером и областью действия предоставленной арены.
- Исключения:
-
UnsupportedOperationException— если этот сегмент не является нативным -
IllegalArgumentException— еслиnewSize < 0 -
IllegalStateException— еслиarena.scope().isAlive() == false -
IllegalCallerException— если вызывающий код находится в модуле, для которого не включен нативный доступ
isReadOnly
boolean isReadOnly()
true, если этот сегмент доступен только для чтения.- Возвращает:
-
true, если этот сегмент доступен только для чтения - См. также:
asReadOnly
MemorySegment asReadOnly()
- Возвращает:
- представление этого сегмента, доступное только для чтения
- См. также:
isNative
boolean isNative()
true, если этот сегмент является нативным. Нативный сегмент создается, например, с помощью фабричного метода Arena.allocate(long, long) (и связанных с ним методов) или путем обертывания прямого буфера.
- Возвращает:
-
true, если этот сегмент является нативным
isMapped
boolean isMapped()
true, если этот сегмент является отображенным сегментом. Отображенный сегмент памяти создается, например, с помощью фабричного метода FileChannel.map(FileChannel.MapMode, long, long, Arena) или путем обертывания отображенного байтового буфера.- Возвращает:
-
true, если этот сегмент является отображенным сегментом
asOverlappingSlice
Optional<MemorySegment> asOverlappingSlice(MemorySegment other)
Два сегмента S1 и S2 считаются пересекающимися, если можно найти как минимум два среза L1 (из S1) и L2 (из S2), использующих одну и ту же область памяти. Поэтому нативный сегмент не может пересекаться с сегментом кучи; в этом случае или если пересечения нет, возвращается пустое значение Optional.
- Параметры:
-
other— сегмент, пересечение которого с этим сегментом нужно проверить - Возвращает:
- срез этого сегмента (в области пересечения)
fill
MemorySegment fill(byte value)
В частности, указанное значение записывается по каждому адресу этого сегмента. Эквивалентно следующему коду (но, скорее всего, выполняется эффективнее):
for (long offset = 0; offset < segment.byteSize(); offset++) {
segment.set(ValueLayout.JAVA_BYTE, offset, value);
}
Этот метод может быть полезен для инициализации или сброса содержимого сегмента памяти.
- Параметры:
-
value— значение, записываемое в этот сегмент - Возвращает:
- этот сегмент памяти
- Исключения:
-
IllegalStateException— если связанная с этим сегментом область действия не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если этот сегмент доступен только для чтения
copyFrom
MemorySegment copyFrom(MemorySegment src)
0 по src.byteSize() - 1 копируются в этот сегмент по смещениям от 0 до src.byteSize() - 1. Вызов этого метода эквивалентен следующему коду:
MemorySegment.copy(src, 0, this, 0, src.byteSize());
- Параметры:
-
src— исходный сегмент - Возвращает:
- этот сегмент
- Исключения:
-
IndexOutOfBoundsException— еслиsrc.byteSize() > this.byteSize() -
IllegalStateException— если связанная с этим сегментом область действия не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalStateException— если связанная сsrcобласть действия не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоsrc.isAccessibleBy(T) == false -
IllegalArgumentException— если этот сегмент доступен только для чтения
mismatch
long mismatch(MemorySegment other)
Если у двух сегментов есть общий префикс, возвращаемое смещение равно длине общего префикса; следовательно, по этому смещению в соответствующих сегментах имеется несовпадение. Если один сегмент является собственным префиксом другого, возвращаемое смещение равно меньшему из размеров сегментов; следовательно, это смещение действительно только для большего сегмента. В противном случае несовпадений нет и возвращается
-1.
- Параметры:
-
other— сегмент, в котором нужно проверить наличие несовпадений с этим сегментом - Возвращает:
- относительное смещение в байтах первого несовпадения между этим и указанным другим сегментом; если несовпадений нет, возвращает -1
- Исключения:
-
IllegalStateException— если связанная с этим сегментом область действия не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalStateException— если связанная сotherобласть действия не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоother.isAccessibleBy(T) == false
isLoaded
boolean isLoaded()
Возвращаемое значение true означает, что весьма вероятно, что все данные этого сегмента находятся в физической памяти и поэтому могут быть доступны без возникновения ошибок страниц виртуальной памяти или операций ввода-вывода. Возвращаемое значение false не обязательно означает, что содержимое этого сегмента не находится в физической памяти.
Возвращаемое значение является подсказкой, а не гарантией, поскольку базовая операционная система могла выгрузить некоторые данные этого сегмента на диск к моменту возврата этого метода.
- Возвращает:
-
true, если содержимое этого сегмента, вероятно, находится в физической памяти - Вызывает:
-
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
UnsupportedOperationException— если этот сегмент не является отображённым сегментом памяти, например еслиisMapped() == false
load
void load()
Этот метод прилагает все усилия, чтобы к моменту возврата содержимое этого сегмента находилось в физической памяти. Вызов этого метода может привести к некоторому количеству ошибок страниц и операций ввода-вывода.
- Вызывает:
-
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
UnsupportedOperationException— если этот сегмент не является отображённым сегментом памяти, например еслиisMapped() == false
unload
void unload()
Этот метод прилагает все усилия, чтобы содержимое этого сегмента перестало находиться в физической памяти. Обращение к содержимому этого сегмента после вызова метода может привести к некоторому количеству ошибок страниц и операций ввода-вывода (поскольку содержимое сегмента может потребоваться снова загрузить в память).
- Вызывает:
-
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
UnsupportedOperationException— если этот сегмент не является отображённым сегментом памяти, например еслиisMapped() == false
force
void force()
Если дескриптор файла, связанный с этим отображённым сегментом, указывает на локальное устройство хранения, то к моменту возврата этого метода гарантируется, что все изменения, внесённые в сегмент с момента его создания или последнего вызова этого метода, будут записаны на это устройство.
Если дескриптор файла, связанный с этим отображённым сегментом, указывает не на локальное устройство, такая гарантия не предоставляется.
Если этот сегмент был отображён не в режиме чтения/записи (FileChannel.MapMode.READ_WRITE), вызов этого метода может не оказать никакого эффекта. В частности, метод не оказывает эффекта для сегментов, отображённых в режимах только для чтения или приватного отображения. Для режимов отображения, зависящих от реализации, этот метод может оказывать или не оказывать эффект.
- Вызывает:
-
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
UnsupportedOperationException— если этот сегмент не является отображённым сегментом памяти, например еслиisMapped() == false -
UncheckedIOException— если при записи содержимого этого сегмента на связанное устройство хранения произошла ошибка ввода-вывода
asByteBuffer
ByteBuffer asByteBuffer()
ByteBuffer. Некоторые свойства возвращённого буфера связаны со свойствами этого сегмента. В частности, результирующий буфер обладает следующими характеристиками: - Он является буфером только для чтения, если этот сегмент является сегментом только для чтения;
- Его позиция равна нулю;
- Его ёмкость и предел равны размеру этого сегмента. По этой причине невозможно вернуть байтовый буфер, если размер сегмента превышает
Integer.MAX_VALUE; - Он является прямым буфером, если это нативный сегмент.
Жизненный цикл возвращённого буфера связан с жизненным циклом этого сегмента. То есть обращение к возвращённому буферу после того, как связанная с этим сегментом область действия перестанет быть активной, приведёт к выбрасыванию IllegalStateException. Аналогично, обращение к возвращённому буферу из потока T, такого что isAccessible(T) == false, приведёт к выбрасыванию WrongThreadException.
Если этот сегмент доступен только из одного потока, вызов операций ввода-вывода для чтения/записи над полученным буфером может привести к выбрасыванию исключений, не определённых спецификацией.
Наконец, порядок байтов результирующего буфера — ByteOrder.BIG_ENDIAN; его можно изменить с помощью ByteBuffer.order(java.nio.ByteOrder).
- Возвращает:
- представление этого сегмента памяти в виде
ByteBuffer - Вызывает:
-
UnsupportedOperationException— если этот сегмент невозможно отобразить на экземплярByteBuffer, например если это сегмент кучи, поддерживаемый массивом, отличным отbyte[]), или если его размер превышаетInteger.MAX_VALUE
toArray
byte[] toArray(ValueLayout.OfByte elementLayout)
- Параметры:
-
elementLayout— схема исходного элемента. Если порядок байтов, связанный со схемой, отличается от порядка байтов платформы, для каждого элемента массива будет выполнена операция перестановки байтов - Возвращает:
- новый массив байтов, содержимое которого скопировано из этого сегмента памяти
- Вызывает:
-
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalStateException— если содержимое этого сегмента невозможно скопировать в экземплярbyte[], например если его размер превышаетInteger.MAX_VALUE
toArray
short[] toArray(ValueLayout.OfShort elementLayout)
- Параметры:
-
elementLayout— схема исходного элемента. Если порядок байтов, связанный со схемой, отличается от порядка байтов платформы, для каждого элемента массива будет выполнена операция перестановки байтов - Возвращает:
- новый массив short, содержимое которого скопировано из этого сегмента памяти
- Вызывает:
-
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalStateException— если содержимое этого сегмента невозможно скопировать в экземплярshort[], например потому чтоbyteSize() % 2 != 0илиbyteSize() / 2 > Integer.MAX_VALUE
toArray
char[] toArray(ValueLayout.OfChar elementLayout)
- Параметры:
-
elementLayout— схема исходного элемента. Если порядок байтов, связанный со схемой, отличается от порядка байтов платформы, для каждого элемента массива будет выполнена операция перестановки байтов - Возвращает:
- новый массив char, содержимое которого скопировано из этого сегмента памяти
- Вызывает:
-
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalStateException— если содержимое этого сегмента невозможно скопировать в экземплярchar[], например потому чтоbyteSize() % 2 != 0илиbyteSize() / 2 > Integer.MAX_VALUE
toArray
int[] toArray(ValueLayout.OfInt elementLayout)
- Параметры:
-
elementLayout— схема исходного элемента. Если порядок байтов, связанный со схемой, отличается от порядка байтов платформы, для каждого элемента массива будет выполнена операция перестановки байтов. - Возвращает:
- новый массив int, содержимое которого скопировано из этого сегмента памяти
- Вызывает:
-
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalStateException— если содержимое этого сегмента невозможно скопировать в экземплярint[], например потому чтоbyteSize() % 4 != 0илиbyteSize() / 4 > Integer.MAX_VALUE
toArray
float[] toArray(ValueLayout.OfFloat elementLayout)
- Параметры:
-
elementLayout— схема исходного элемента. Если порядок байтов, связанный со схемой, отличается от порядка байтов платформы, для каждого элемента массива будет выполнена операция перестановки байтов - Возвращает:
- новый массив float, содержимое которого скопировано из этого сегмента памяти
- Вызывает:
-
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalStateException— если содержимое этого сегмента невозможно скопировать в экземплярfloat[], например потому чтоbyteSize() % 4 != 0илиbyteSize() / 4 > Integer.MAX_VALUE
toArray
long[] toArray(ValueLayout.OfLong elementLayout)
- Параметры:
-
elementLayout— схема исходного элемента. Если порядок байтов, связанный со схемой, отличается от порядка байтов платформы, для каждого элемента массива будет выполнена операция перестановки байтов - Возвращает:
- новый массив long, содержимое которого скопировано из этого сегмента памяти
- Вызывает:
-
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalStateException— если содержимое этого сегмента невозможно скопировать в экземплярlong[], например потому чтоbyteSize() % 8 != 0илиbyteSize() / 8 > Integer.MAX_VALUE
toArray
double[] toArray(ValueLayout.OfDouble elementLayout)
- Параметры:
-
elementLayout— схема исходного элемента. Если порядок байтов, связанный со схемой, отличается от порядка байтов платформы, для каждого элемента массива будет выполнена операция перестановки байтов - Возвращает:
- новый массив double, содержимое которого скопировано из этого сегмента памяти
- Вызывает:
-
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalStateException— если содержимое этого сегмента невозможно скопировать в экземплярdouble[], например потому чтоbyteSize() % 8 != 0илиbyteSize() / 8 > Integer.MAX_VALUE
getString
String getString(long offset)
Вызов этого метода эквивалентен следующему коду:
getString(offset, StandardCharsets.UTF_8);
- Параметры:
-
offset— смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена эта операция доступа - Возвращает:
- строку Java, созданную из байтов, считанных по указанному начальному адресу до первого символа-терминатора
'\0'(не включая его, если он найден) - Вызывает:
-
IllegalArgumentException— если размер строки превышает максимальный размер строки, поддерживаемый платформой -
IndexOutOfBoundsException— еслиoffset < 0 -
IndexOutOfBoundsException— если в этом сегменте между указаннымoffsetи концом сегмента отсутствует терминатор строки (например,'\0'). -
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false
getString
String getString(long offset, Charset charset)
Этот метод всегда заменяет последовательности некорректных входных данных и символов, которые невозможно отобразить, строкой замены по умолчанию для этой кодировки. Если требуется более строгий контроль над процессом декодирования, следует использовать класс CharsetDecoder.
Получить строку из сегмента, если известны смещение и длина в байтах, можно с помощью getString(long, Charset, long).
- Параметры:
-
offset— смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена эта операция доступа -
charset— кодировка, используемая для декодирования байтов строки.charsetдолжна быть стандартной кодировкой - Возвращает:
- строку Java, созданную из байтов, считанных по указанному начальному адресу до первого символа-терминатора
'\0'(не включая его, если он найден) - Вызывает:
-
IllegalArgumentException— если размер строки превышает максимальный размер строки, поддерживаемый платформой -
IndexOutOfBoundsException— еслиoffset < 0 -
IndexOutOfBoundsException— если в этом сегменте между указаннымoffsetи концом сегмента отсутствует терминатор строки (например,'\0'). Размер терминатора строки в байтах зависит от выбраннойcharset. Например, он равен 1 дляStandardCharsets.US_ASCIIи 2 дляStandardCharsets.UTF_16 -
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— еслиcharsetне является стандартной кодировкой
getString
String getString(long offset, Charset charset, long byteLength)
Этот метод всегда заменяет последовательности некорректных входных данных и символов, которые невозможно отобразить, строкой замены по умолчанию для этой кодировки. Если требуется более строгий контроль над процессом декодирования, следует использовать класс CharsetDecoder.
Если строка содержит символы '\0', они также будут прочитаны. Это отличается от поведения метода getString(long, Charset), который читает данные только до первого '\0', поэтому строковые данные, содержащие символ '\0', будут усечены.
- Параметры:
-
offset— смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена эта операция доступа -
charset— кодировка, используемая для декодирования байтов строки -
byteLength— длина области памяти в байтах, которую необходимо прочитать и декодировать в строку - Возвращает:
- строку Java, созданную из байтов, считанных по указанному начальному адресу в пределах заданной длины
- Вызывает:
-
IllegalArgumentException— если размер строки превышает максимальный размер строки, поддерживаемый платформой -
IndexOutOfBoundsException— еслиoffset < 0 -
IndexOutOfBoundsException— еслиoffset > byteSize() - byteLength -
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— еслиbyteLength < 0 - Начиная с:
- 27
setString
void setString(long offset, String str)
Вызов этого метода эквивалентен следующему коду:
setString(offset, str, StandardCharsets.UTF_8);
- Параметры:
-
offset— смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена эта операция доступа; итоговый адрес операции записи можно выразить какaddress() + offset. -
str— строка Java, которую необходимо записать в этот сегмент - Вызывает:
-
IndexOutOfBoundsException— еслиoffset < 0 -
IndexOutOfBoundsException— еслиoffset > byteSize() - (B + 1), гдеB— размер строки в байтах, закодированной с использованием UTF-8str.getBytes(StandardCharsets.UTF_8).length) -
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если этот сегмент доступен только для чтения
setString
void setString(long offset, String str, Charset charset)
Этот метод всегда заменяет последовательности некорректных входных данных и символов, которые невозможно отобразить, строкой замены по умолчанию для этой кодировки. Если требуется более строгий контроль над процессом декодирования, следует использовать класс CharsetDecoder.
Если указанная строка содержит символы '\0', они также будут скопированы. Это означает, что в зависимости от метода чтения строки, например getString(long), при повторном чтении строка будет усечена. Прочитать строку без усечения можно с помощью getString(long, Charset, long).
- Параметры:
-
offset— смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена эта операция доступа; итоговый адрес операции записи можно выразить какaddress() + offset -
str— строка Java, которую необходимо записать в этот сегмент -
charset— кодировка, используемая для кодирования байтов строки.charsetдолжна быть стандартной кодировкой - Вызывает:
-
IndexOutOfBoundsException— еслиoffset < 0 -
IndexOutOfBoundsException— еслиoffset > byteSize() - (B + N), где:-
B— размер строки в байтах, закодированной с использованием заданной кодировки (например,str.getBytes(charset).length); -
N— размер (в байтах) символа-терминатора в заданной кодировке. Например, он равен 1 дляStandardCharsets.US_ASCIIи 2 дляStandardCharsets.UTF_16.
-
-
IllegalStateException— если область действия, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— еслиcharsetне является стандартной кодировкой -
IllegalArgumentException— если этот сегмент доступен только для чтения
ofBuffer
static MemorySegment ofBuffer(Buffer buffer)
Buffer. Начало сегмента соответствует позиции буфера (включительно), а конец — его пределу (не включая его). Если буфер доступен только для чтения, результирующий сегмент также будет доступен только для чтения. Кроме того, если буфер является прямым буфером, возвращённый сегмент будет нативным; в противном случае возвращённый сегмент памяти будет сегментом кучи.
Если указанный буфер был получен вызовом asByteBuffer() для сегмента памяти, область действия которого — S, возвращённый сегмент будет связан с той же областью действия S. В противном случае областью действия возвращённого сегмента будет автоматическая область, сохраняющая доступность указанного буфера. Поэтому, если указанный буфер является прямым, связанная с ним область памяти не будет освобождена, пока возвращённый сегмент или любой из его фрагментов остаётся доступным.
- Параметры:
-
buffer— экземпляр буфера, который необходимо преобразовать в новый сегмент памяти - Возвращает:
- сегмент памяти, созданный на основе указанного экземпляра буфера
- Вызывает:
-
IllegalArgumentException— если указанныйbufferявляется буфером кучи, но не связан с массивом; например, буферы, полученные прямо или косвенно с помощью (CharBuffer.wrap(CharSequence)илиCharBuffer.wrap(char[], int, int), не связаны с массивом.
ofArray
static MemorySegment ofArray(byte[] byteArray)
address() равен нулю.- Параметры:
-
byteArray— примитивный массив, поддерживающий сегмент памяти кучи - Возвращает:
- сегмент памяти кучи, связанный с массивом байтов
ofArray
static MemorySegment ofArray(char[] charArray)
address() равен нулю.- Параметры:
-
charArray— примитивный массив, поддерживающий сегмент кучи - Возвращает:
- сегмент памяти кучи, связанный с массивом char
ofArray
static MemorySegment ofArray(short[] shortArray)
address() равен нулю.- Параметры:
-
shortArray— примитивный массив, поддерживающий сегмент кучи - Возвращает:
- сегмент памяти кучи, связанный с массивом short
ofArray
static MemorySegment ofArray(int[] intArray)
address() равен нулю.- Параметры:
-
intArray— примитивный массив, поддерживающий сегмент кучи - Возвращает:
- сегмент памяти кучи, связанный с массивом int
ofArray
static MemorySegment ofArray(float[] floatArray)
address() равен нулю.- Параметры:
-
floatArray— примитивный массив, на основе которого создан сегмент кучи - Возвращает:
- сегмент памяти кучи, созданный на основе массива float
ofArray
static MemorySegment ofArray(long[] longArray)
address() равен нулю.- Параметры:
-
longArray— примитивный массив, на основе которого создан сегмент кучи - Возвращает:
- сегмент памяти кучи, созданный на основе массива long
ofArray
static MemorySegment ofArray(double[] doubleArray)
address() равен нулю.- Параметры:
-
doubleArray— примитивный массив, на основе которого создан сегмент кучи - Возвращает:
- сегмент памяти кучи, созданный на основе массива double
ofAddress
static MemorySegment ofAddress(long address)
Возвращенный сегмент связан с глобальной областью действия и доступен из любого потока.
На 32-разрядных платформах указанное значение адреса нормализуется таким образом, чтобы старшие («левые») 32 бита address возвращенного сегмента памяти были равны нулю.
- Параметры:
-
address— адрес возвращенного сегмента нативной памяти - Возвращает:
- сегмент нативной памяти нулевой длины с указанным адресом
copy
static void copy(MemorySegment srcSegment, long srcOffset, MemorySegment dstSegment, long dstOffset, long bytes)
srcOffset по srcOffset + bytes - 1 исходного сегмента копируются в целевой сегмент с позиции dstOffset по dstOffset + bytes - 1. Если исходный сегмент перекрывается с целевым сегментом, копирование выполняется так, как если бы байты с позиции srcOffset по srcOffset + bytes - 1 исходного сегмента сначала были скопированы во временный сегмент размером bytes, а затем содержимое временного сегмента было скопировано в целевой сегмент с позиции dstOffset по dstOffset + bytes - 1.
Результат массового копирования не определен в редком случае, когда исходный и целевой сегменты не перекрываются, но ссылаются на перекрывающиеся области одного и того же хранилища, используя разные адреса. Например, такое может произойти, если один и тот же файл отображен в память в двух сегментах.
Вызов этого метода эквивалентен следующему коду:
MemorySegment.copy(srcSegment, ValueLayout.JAVA_BYTE, srcOffset, dstSegment, ValueLayout.JAVA_BYTE, dstOffset, bytes);
- Параметры:
-
srcSegment— исходный сегмент -
srcOffset— начальное смещение в байтах в исходном сегменте -
dstSegment— целевой сегмент -
dstOffset— начальное смещение в байтах в целевом сегменте -
bytes— количество байтов для копирования - Вызывает исключение:
-
IllegalStateException— если связанная сsrcSegmentобласть действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоsrcSegment.isAccessibleBy(T) == false -
IllegalStateException— если связанная сdstSegmentобласть действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоdstSegment.isAccessibleBy(T) == false -
IndexOutOfBoundsException— еслиsrcOffset > srcSegment.byteSize() - bytes -
IndexOutOfBoundsException— еслиdstOffset > dstSegment.byteSize() - bytes -
IndexOutOfBoundsException— еслиsrcOffset,dstOffsetилиbytesявляются< 0 -
IllegalArgumentException— еслиdstSegmentдоступен только для чтения
copy
static void copy(MemorySegment srcSegment, ValueLayout srcElementLayout, long srcOffset, MemorySegment dstSegment, ValueLayout dstElementLayout, long dstOffset, long elementCount)
S — размер в байтах макетов элементов, байты с позиции srcOffset по srcOffset + (elementCount * S) - 1 исходного сегмента копируются в целевой сегмент с позиции dstOffset по dstOffset + (elementCount * S) - 1. Копирование выполняется поэлементно: байты исходного сегмента интерпретируются как последовательность элементов с макетом srcElementLayout, а байты целевого сегмента — как последовательность элементов с макетом dstElementLayout. Размер S обоих макетов элементов должен совпадать. Если порядок байтов в двух указанных макетах элементов различается, байты каждого копируемого элемента переставляются соответствующим образом в процессе копирования.
Если исходный сегмент перекрывается с целевым сегментом, копирование выполняется так, как если бы байты с позиции srcOffset по srcOffset + (elementCount * S) - 1 исходного сегмента сначала были скопированы во временный сегмент размером bytes, а затем содержимое временного сегмента было скопировано в целевой сегмент с позиции dstOffset по dstOffset + (elementCount * S) - 1.
Результат массового копирования не определен в редком случае, когда исходный и целевой сегменты не перекрываются, но ссылаются на перекрывающиеся области одного и того же хранилища, используя разные адреса. Например, такое может произойти, если один и тот же файл отображен в память в двух сегментах.
- Параметры:
-
srcSegment— исходный сегмент -
srcElementLayout— макет элемента, связанный с исходным сегментом -
srcOffset— начальное смещение в байтах в исходном сегменте -
dstSegment— целевой сегмент -
dstElementLayout— макет элемента, связанный с целевым сегментом -
dstOffset— начальное смещение в байтах в целевом сегменте -
elementCount— количество элементов для копирования - Вызывает исключение:
-
IllegalArgumentException— если размеры макетов элементов различаются или сегмент/смещение источника (соответственно, назначения) несовместимы с ограничением выравнивания в макете элемента источника (соответственно, назначения) -
IllegalArgumentException— еслиsrcElementLayout.byteAlignment() > srcElementLayout.byteSize() -
IllegalArgumentException— еслиdstElementLayout.byteAlignment() > dstElementLayout.byteSize() -
IllegalStateException— если связанная сsrcSegmentобласть действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоsrcSegment.isAccessibleBy(T) == false -
IllegalStateException— если связанная сdstSegmentобласть действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоdstSegment.isAccessibleBy(T) == false -
IllegalArgumentException— еслиdstSegmentдоступен только для чтения -
IndexOutOfBoundsException— если происходит переполнениеelementCount * srcLayout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеelementCount * dtsLayout.byteSize() -
IndexOutOfBoundsException— еслиsrcOffset > srcSegment.byteSize() - (elementCount * srcLayout.byteSize()) -
IndexOutOfBoundsException— еслиdstOffset > dstSegment.byteSize() - (elementCount * dstLayout.byteSize()) -
IndexOutOfBoundsException— еслиsrcOffset,dstOffsetилиelementCountявляются< 0
get
byte get(ValueLayout.OfByte layout, long offset)
- Параметры:
-
layout— макет области памяти, из которой выполняется чтение -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа. - Возвращает:
- значение byte, прочитанное из этого сегмента
- Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0
set
void set(ValueLayout.OfByte layout, long offset, byte value)
- Параметры:
-
layout— макет области памяти, в которую выполняется запись -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа. -
value— записываемое значение byte. - Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
get
boolean get(ValueLayout.OfBoolean layout, long offset)
- Параметры:
-
layout— макет области памяти, из которой выполняется чтение -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа - Возвращает:
- значение boolean, прочитанное из этого сегмента
- Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0
set
void set(ValueLayout.OfBoolean layout, long offset, boolean value)
- Параметры:
-
layout— макет области памяти, в которую выполняется запись -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа -
value— записываемое значение boolean - Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
get
char get(ValueLayout.OfChar layout, long offset)
- Параметры:
-
layout— макет области памяти, из которой выполняется чтение -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа - Возвращает:
- значение char, прочитанное из этого сегмента
- Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0
set
void set(ValueLayout.OfChar layout, long offset, char value)
- Параметры:
-
layout— макет области памяти, в которую выполняется запись -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа. -
value— записываемое значение char - Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
get
short get(ValueLayout.OfShort layout, long offset)
- Параметры:
-
layout— макет области памяти, из которой выполняется чтение -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа - Возвращает:
- значение short, прочитанное из этого сегмента
- Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0
set
void set(ValueLayout.OfShort layout, long offset, short value)
- Параметры:
-
layout— макет области памяти, в которую выполняется запись -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа. -
value— записываемое значение short - Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
get
int get(ValueLayout.OfInt layout, long offset)
- Параметры:
-
layout— макет области памяти, из которой выполняется чтение -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа. - Возвращает:
- значение int, прочитанное из этого сегмента
- Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0
set
void set(ValueLayout.OfInt layout, long offset, int value)
- Параметры:
-
layout— макет области памяти, в которую выполняется запись -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа -
value— записываемое значение int - Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
get
float get(ValueLayout.OfFloat layout, long offset)
- Параметры:
-
layout— макет области памяти, из которой выполняется чтение -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа - Возвращает:
- значение float, прочитанное из этого сегмента
- Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0
set
void set(ValueLayout.OfFloat layout, long offset, float value)
- Параметры:
-
layout— макет области памяти, в которую выполняется запись -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа -
value— записываемое значение float - Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
get
long get(ValueLayout.OfLong layout, long offset)
- Параметры:
-
layout— макет области памяти, из которой выполняется чтение -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа. - Возвращает:
- значение long, прочитанное из этого сегмента
- Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0
set
void set(ValueLayout.OfLong layout, long offset, long value)
- Параметры:
-
layout— макет области памяти, в которую выполняется запись -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа. -
value— записываемое значение long. - Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
get
double get(ValueLayout.OfDouble layout, long offset)
- Параметры:
-
layout— макет области памяти, из которой выполняется чтение -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа - Возвращает:
- значение double, прочитанное из этого сегмента
- Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0
set
void set(ValueLayout.OfDouble layout, long offset, double value)
- Параметры:
-
layout— макет области памяти, в которую выполняется запись -
offset— смещение в байтах (относительно адреса этого сегмента), по которому выполняется операция доступа -
value— записываемое значение double - Вызывает исключение:
-
IllegalStateException— если связанная с этим сегментом область действия не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в указанном макете -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
get
MemorySegment get(AddressLayout layout, long offset)
0. Однако если предоставленный layout адреса имеет целевой layout T, размер возвращаемого сегмента устанавливается равным T.byteSize().- Параметры:
-
layout— layout области памяти, которую необходимо прочитать -
offset— смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена эта операция доступа - Возвращает:
- нативный сегмент, оборачивающий адрес, прочитанный из этого сегмента
- Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— если предоставленный layout адреса имеет целевой layoutT, а адрес возвращаемого сегмента несовместим с ограничением выравнивания вT -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0
set
void set(AddressLayout layout, long offset, MemorySegment value)
- Параметры:
-
layout— layout области памяти, в которую необходимо выполнить запись -
offset— смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена эта операция доступа. -
value— записываемое значение адреса. - Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IndexOutOfBoundsException— еслиoffset > byteSize() - layout.byteSize()илиoffset < 0 -
IllegalArgumentException— еслиvalueне является нативным сегментом -
IllegalArgumentException— если этот сегмент доступен только для чтения
getAtIndex
byte getAtIndex(ValueLayout.OfByte layout, long index)
- Параметры:
-
layout— layout области памяти, которую необходимо прочитать -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). - Возвращает:
- значение типа byte, прочитанное из этого сегмента
- Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0
getAtIndex
boolean getAtIndex(ValueLayout.OfBoolean layout, long index)
- Параметры:
-
layout— layout области памяти, которую необходимо прочитать -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). - Возвращает:
- логическое значение, прочитанное из этого сегмента
- Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0
getAtIndex
char getAtIndex(ValueLayout.OfChar layout, long index)
- Параметры:
-
layout— layout области памяти, которую необходимо прочитать -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). - Возвращает:
- значение типа char, прочитанное из этого сегмента
- Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0
setAtIndex
void setAtIndex(ValueLayout.OfChar layout, long index, char value)
- Параметры:
-
layout— layout области памяти, в которую необходимо выполнить запись -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). -
value— записываемое значение типа char - Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
getAtIndex
short getAtIndex(ValueLayout.OfShort layout, long index)
- Параметры:
-
layout— layout области памяти, которую необходимо прочитать -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). - Возвращает:
- значение типа short, прочитанное из этого сегмента
- Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0
setAtIndex
void setAtIndex(ValueLayout.OfByte layout, long index, byte value)
- Параметры:
-
layout— layout области памяти, в которую необходимо выполнить запись -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). -
value— записываемое значение типа short - Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
setAtIndex
void setAtIndex(ValueLayout.OfBoolean layout, long index, boolean value)
- Параметры:
-
layout— layout области памяти, в которую необходимо выполнить запись -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). -
value— записываемое значение типа short - Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
setAtIndex
void setAtIndex(ValueLayout.OfShort layout, long index, short value)
- Параметры:
-
layout— layout области памяти, в которую необходимо выполнить запись -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). -
value— записываемое значение типа short - Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
getAtIndex
int getAtIndex(ValueLayout.OfInt layout, long index)
- Параметры:
-
layout— layout области памяти, которую необходимо прочитать. -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). - Возвращает:
- значение типа int, прочитанное из этого сегмента
- Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0
setAtIndex
void setAtIndex(ValueLayout.OfInt layout, long index, int value)
- Параметры:
-
layout— layout области памяти, в которую необходимо выполнить запись -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). -
value— записываемое значение типа int - Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
getAtIndex
float getAtIndex(ValueLayout.OfFloat layout, long index)
- Параметры:
-
layout— layout области памяти, которую необходимо прочитать -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). - Возвращает:
- значение типа float, прочитанное из этого сегмента
- Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0
setAtIndex
void setAtIndex(ValueLayout.OfFloat layout, long index, float value)
- Параметры:
-
layout— layout области памяти, в которую необходимо выполнить запись -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). -
value— записываемое значение типа float - Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
getAtIndex
long getAtIndex(ValueLayout.OfLong layout, long index)
- Параметры:
-
layout— layout области памяти, которую необходимо прочитать -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). - Возвращает:
- значение типа long, прочитанное из этого сегмента
- Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0
setAtIndex
void setAtIndex(ValueLayout.OfLong layout, long index, long value)
- Параметры:
-
layout— layout области памяти, в которую необходимо выполнить запись -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). -
value— записываемое значение типа long - Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
getAtIndex
double getAtIndex(ValueLayout.OfDouble layout, long index)
- Параметры:
-
layout— layout области памяти, которую необходимо прочитать -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). - Возвращает:
- значение типа double, прочитанное из этого сегмента
- Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0
setAtIndex
void setAtIndex(ValueLayout.OfDouble layout, long index, double value)
- Параметры:
-
layout— layout области памяти, в которую необходимо выполнить запись -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). -
value— записываемое значение типа double - Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0 -
IllegalArgumentException— если этот сегмент доступен только для чтения
getAtIndex
MemorySegment getAtIndex(AddressLayout layout, long index)
0. Однако если предоставленный layout адреса имеет целевой layout T, размер возвращаемого сегмента устанавливается равным T.byteSize().- Параметры:
-
layout— layout области памяти, которую необходимо прочитать -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). - Возвращает:
- нативный сегмент, оборачивающий адрес, прочитанный из этого сегмента
- Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout. -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IllegalArgumentException— если предоставленный layout адреса имеет целевой layoutT, а адрес возвращаемого сегмента несовместим с ограничением выравнивания вT -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0
setAtIndex
void setAtIndex(AddressLayout layout, long index, MemorySegment value)
- Параметры:
-
layout— layout области памяти, в которую необходимо выполнить запись -
index— логический индекс. Смещение в байтах (относительно адреса этого сегмента), по которому будет выполнена операция доступа, можно выразить как(index * layout.byteSize()). -
value— записываемое значение адреса - Выбрасывает:
-
IllegalStateException— если область видимости, связанная с этим сегментом, не является активной -
WrongThreadException— если этот метод вызван из потокаT, так чтоisAccessibleBy(T) == false -
IllegalArgumentException— если операция доступа несовместима с ограничением выравнивания в предоставленном layout. -
IllegalArgumentException— еслиlayout.byteAlignment() > layout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеindex * layout.byteSize() -
IndexOutOfBoundsException— еслиindex * layout.byteSize() > byteSize() - layout.byteSize()илиindex < 0 -
IllegalArgumentException— еслиvalueне является нативным сегментом -
IllegalArgumentException— если этот сегмент доступен только для чтения
equals
boolean equals(Object that)
true тогда и только тогда, когда указанный объект также является сегментом памяти и оба сегмента ссылаются на одно и то же местоположение в некоторой области памяти. Точнее, чтобы два сегмента s1 и s2 считались равными, должны выполняться все следующие условия:
-
s1.heapBase().equals(s2.heapBase()), то есть оба сегмента должны быть одного типа: либо оба являются нативными сегментами, использующими память вне кучи, либо оба используют один и тот же объект Java в куче; -
s1.address() == s2.address(), то есть адреса обоих сегментов должны совпадать. Это означает, что оба сегмента либо ссылаются на одно и то же местоположение в некоторой области вне кучи, либо на одно и то же смещение внутри связанного с ними объекта Java.
- Переопределяет:
-
equalsв классеObject - Примечание API:
- Этот метод не выполняет структурное сравнение содержимого двух сегментов памяти. Клиенты могут сравнить сегменты памяти структурно с помощью метода
mismatch(MemorySegment). Обратите внимание, что этот метод не сравнивает временные и пространственные границы двух сегментов. Поэтому он подходит для проверки того, имеют ли два сегмента одинаковый адрес. - Параметры:
-
that— объект, который сравнивается на равенство с этим сегментом памяти - Возвращает:
-
true, если указанный объект равен этому сегменту памяти - См. также:
hashCode
copy
static void copy(MemorySegment srcSegment, ValueLayout srcLayout, long srcOffset, Object dstArray, int dstIndex, int elementCount)
Поддерживаются следующие типы массивов: byte[], char[], short[], int[], float[], long[] и double[].
- Параметры:
-
srcSegment— исходный сегмент -
srcLayout— макет исходного элемента. Если порядок байтов, связанный с макетом, отличается от порядка байтов платформы, для каждого элемента массива выполняется операция перестановки байтов -
srcOffset— начальное смещение исходного сегмента в байтах -
dstArray— массив назначения -
dstIndex— начальный индекс массива назначения -
elementCount— количество копируемых элементов массива - Выбрасывает:
-
IllegalStateException— если область действия, связанная сsrcSegment, не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоsrcSegment.isAccessibleBy(T) == false -
IllegalArgumentException— еслиdstArrayне является массивом или является массивом неподдерживаемого типа -
IllegalArgumentException— если тип компонента массива назначения не соответствуетsrcLayout.carrier() -
IllegalArgumentException— еслиoffsetнесовместимо с ограничением выравнивания в макете исходного элемента -
IllegalArgumentException— еслиsrcLayout.byteAlignment() > srcLayout.byteSize() -
IndexOutOfBoundsException— если происходит переполнениеelementCount * srcLayout.byteSize() -
IndexOutOfBoundsException— еслиsrcOffset > srcSegment.byteSize() - (elementCount * srcLayout.byteSize()) -
IndexOutOfBoundsException— еслиdstIndex > dstArray.length - elementCount -
IndexOutOfBoundsException— еслиsrcOffset,dstIndexилиelementCountявляются< 0
copy
static void copy(Object srcArray, int srcIndex, MemorySegment dstSegment, ValueLayout dstLayout, long dstOffset, int elementCount)
Элементы, размер и ограничения выравнивания которых задаются указанным макетом, считываются из исходного массива, начиная с указанного индекса, и копируются в целевой сегмент, начиная с указанного смещения (в байтах).
Поддерживаются следующие типы массивов: byte[], char[], short[], int[], float[], long[] и double[].
- Параметры:
-
srcArray— исходный массив -
srcIndex— начальный индекс исходного массива -
dstSegment— целевой сегмент -
dstLayout— макет целевого элемента. Если порядок байтов, связанный с макетом, отличается от порядка байтов платформы, для каждого элемента массива выполняется операция перестановки байтов. -
dstOffset— начальное смещение целевого сегмента в байтах -
elementCount— количество копируемых элементов массива - Выбрасывает:
-
IllegalStateException— если область действия, связанная сdstSegment, не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоdstSegment.isAccessibleBy(T) == false -
IllegalArgumentException— еслиsrcArrayне является массивом или является массивом неподдерживаемого типа -
IllegalArgumentException— если тип компонента исходного массива не соответствуетsrcLayout.carrier() -
IllegalArgumentException— еслиoffsetнесовместимо с ограничением выравнивания в макете исходного элемента -
IllegalArgumentException— еслиdstLayout.byteAlignment() > dstLayout.byteSize() -
IllegalArgumentException— еслиdstSegmentдоступен только для чтения -
IndexOutOfBoundsException— если происходит переполнениеelementCount * dstLayout.byteSize() -
IndexOutOfBoundsException— еслиdstOffset > dstSegment.byteSize() - (elementCount * dstLayout.byteSize()) -
IndexOutOfBoundsException— еслиsrcIndex > srcArray.length - elementCount -
IndexOutOfBoundsException— еслиsrcIndex,dstOffsetилиelementCountявляются< 0
copy
static long copy(String src, Charset dstEncoding, int srcIndex, MemorySegment dst, long dstOffset, int numChars)
Этот метод всегда заменяет некорректные входные последовательности и последовательности несопоставимых символов строкой замены по умолчанию для данной кодировки. Если требуется более точно управлять процессом декодирования, следует использовать класс CharsetDecoder.
Если заданная строка содержит символы '\0', они также будут скопированы. Это означает, что в зависимости от метода чтения строки, например getString(long), при повторном чтении строка будет усечена. Строку можно прочитать без усечения с помощью getString(long, Charset, long).
- Параметры:
-
src— строка Java, записываемая в целевой сегмент -
dstEncoding— кодировка, используемая для кодирования байтов строки. -
srcIndex— начальный индекс символа исходной строки -
dst— целевой сегмент -
dstOffset— начальное смещение целевого сегмента в байтах -
numChars— количество копируемых символов - Возвращает:
- количество скопированных байтов.
- Выбрасывает:
-
IllegalStateException— если область действия, связанная сdst, не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоdst.isAccessibleBy(T) == false -
IndexOutOfBoundsException— еслиsrcIndex,numCharsилиdstOffsetявляются< 0 -
IndexOutOfBoundsException— еслиsrcIndex > src.length() - numChars -
IllegalArgumentException— еслиdstдоступен только для чтения -
IndexOutOfBoundsException— еслиdstOffset > dstSegment.byteSize() - B, гдеB— размер в байтах подстрокиsrc, закодированной с использованием указанной кодировки - Начиная с:
- 27
mismatch
static long mismatch(MemorySegment srcSegment, long srcFromOffset, long srcToOffset, MemorySegment dstSegment, long dstFromOffset, long dstToOffset)
srcFromOffset до srcToOffset - 1 сравниваются с байтами целевого сегмента со смещениями от dstFromOffset до dstToOffset - 1. Если два сегмента в указанных диапазонах имеют общий префикс, возвращаемое смещение равно длине общего префикса; следовательно, в этом относительном смещении внутри соответствующих сегментов имеется несовпадение. Если один сегмент является собственным префиксом другого в указанных диапазонах, возвращаемое смещение равно длине меньшего диапазона; следовательно, это относительное смещение действительно только для сегмента с большим диапазоном. В противном случае несовпадений нет, и возвращается -1.
- Параметры:
-
srcSegment— исходный сегмент. -
srcFromOffset— смещение (включительно) первого проверяемого байта в исходном сегменте -
srcToOffset— смещение (исключительно) последнего проверяемого байта в исходном сегменте -
dstSegment— целевой сегмент -
dstFromOffset— смещение (включительно) первого проверяемого байта в целевом сегменте -
dstToOffset— смещение (исключительно) последнего проверяемого байта в целевом сегменте - Возвращает:
- относительное смещение в байтах первого несовпадения между исходным и целевым сегментами; если несовпадений нет, возвращает -1
- Выбрасывает:
-
IllegalStateException— если область действия, связанная сsrcSegment, не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоsrcSegment.isAccessibleBy(T) == false -
IllegalStateException— если область действия, связанная сdstSegment, не активна -
WrongThreadException— если этот метод вызван из потокаT, такого чтоdstSegment.isAccessibleBy(T) == false -
IndexOutOfBoundsException— еслиsrcFromOffset < 0,srcToOffset < srcFromOffsetилиsrcToOffset > srcSegment.byteSize() -
IndexOutOfBoundsException— еслиdstFromOffset < 0,dstToOffset < dstFromOffsetилиdstToOffset > dstSegment.byteSize() - См. также:
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
reinterpretтолько при включенном доступе к ограниченным методам.