Интерфейс Arena
- Все суперинтерфейсы:
-
AutoCloseable,SegmentAllocatorPREVIEW
public interface Arena extends SegmentAllocatorPREVIEW, AutoCloseable
Arena — это API предварительного просмотра платформы Java. Арена имеет объект области видимостиПРЕДПРОСМОТР — область видимости арены. Все сегменты, выделенные в арене, связаны с областью видимости арены. Таким образом, арена определяет временные границы всех сегментов памяти, выделенных ей.
Кроме того, арена также определяет, должен ли доступ к сегментам памяти, выделенным в ней, быть ограниченПРЕДПРОСМОТР определёнными потоками. Арена является SegmentAllocatorПРЕДПРОСМОТР и имеет несколько методов выделения, которые могут быть использованы клиентами для получения системных сегментов.
Самой простой арендой является глобальная арена. Глобальная арена имеет неограниченный срок жизни. Таким образом, системные сегменты, выделенные с помощью глобальной арены, всегда доступны, а их подлежащие области памяти никогда не освобождаются. Кроме того, к сегментам памяти, выделенным с помощью глобальной арены, можно обратитьсяПРЕДПРОСМОТР из любого потока.
MemorySegment segment = Arena.global().allocate(100, 1);
...
// segment is never deallocated!
В качестве альтернативы, клиенты могут получить автоматическую арену, которая является арендой с ограниченным сроком жизни, который управляется сборщиком мусора автоматически. Таким образом, области памяти, лежащие в основе сегментов памяти, выделенных с помощью автоматической арены, освобождаются в какой-то момент после того, как автоматическая арена (и все выделенные ею сегменты) становится недоступной, как показано ниже:
MemorySegment segment = Arena.ofAuto().allocate(100, 1);
...
segment = null; // the segment region becomes available for deallocation after this point
Вместо того, чтобы оставлять освобождение памяти в руках среды выполнения Java, клиенты часто захотят контролировать время освобождения областей памяти, лежащих в основе сегментов памяти. Это поддерживается двумя типами арен: ограниченной и совместной арен. Оба они имеют ограниченный срок жизни, который управляется вручную. Например, срок жизни ограниченной арены начинается при создании ограниченной арены и заканчивается при её закрытии. В результате, области памяти, лежащие в основе сегментов памяти, выделенных с помощью ограниченной арены, освобождаются при закрытии ограниченной арены. Когда это происходит, все сегменты, выделенные с помощью ограниченной арены, становятся недоступными, и последующие операции доступа к этим сегментам завершатся ошибкой IllegalStateException:
MemorySegment segment = null;
try (Arena arena = Arena.ofConfined()) {
segment = arena.allocate(100);
...
} // segment region deallocated here
segment.get(ValueLayout.JAVA_BYTE, 0); // throws IllegalStateException
Характеристики различных арен суммированы в следующей таблице:
Тип Ограниченный срок жизни Возможность явного закрытия Доступ из нескольких потоков Глобальная Нет Нет Да Автоматическая Да Нет Да Ограниченная Да Да Нет Совместная Да Да Да
Безопасность и ограничение по потокам
Арены обеспечивают сильные гарантии временной безопасности: к сегменту памяти, выделенному арендой, невозможно обратиться после того, как арена была закрыта. Стоимость обеспечения этой гарантии зависит от количества потоков, имеющих доступ к сегментам памяти, выделенным арендой. Например, если арена всегда создается и закрывается одним потоком, а к сегментам памяти, выделенным этой арендой, всегда обращается тот же поток, то обеспечение корректности тривиально.И наоборот, если арена выделяет сегменты, к которым могут обращаться несколько потоков, или если арена может быть закрыта потоком, отличным от потока доступа, то обеспечение корректности намного сложнее. Например, к сегменту, выделенному арендой, может быть обращено одновременно с попыткой другого потока закрыть арену. Чтобы обеспечить сильную временную гарантию безопасности без принудительного введения накладных расходов для каждого клиента, даже простых, арены делятся на ограниченные по потокам арены и совместные арены.
Ограниченные арены обеспечивают строгие гарантии ограничения доступа по потокам. При создании им назначается владеющий поток, обычно поток, который инициировал операцию создания. К сегментам, созданным ограниченной арендой, может обращаться только владеющий потокПРЕДПРОСМОТР. Кроме того, любая попытка закрыть ограниченную арену из потока, отличного от владеющего, завершится ошибкой WrongThreadException.
У совместных арен нет владеющего потока. К сегментам, созданным совместной арендой, может обращаться любой потокПРЕДПРОСМОТР. Это может быть полезно, когда нескольким потокам нужно одновременно обратиться к одному сегменту памяти (например, в случае параллельной обработки). Кроме того, совместную арену может закрыть любой поток.
Пользовательские арены
Клиенты могут определять пользовательские арены для реализации более эффективных стратегий выделения или лучшего контроля над тем, когда (и кем) арена может быть закрыта. Например, следующий код определяет арену нарезки, которая ведет себя как ограниченная арена (т.е. доступ по одному потоку), но внутри использует аллокатор нарезкиПРЕДПРОСМОТР для обработки запросов на выделение. Когда арена нарезки закрывается, подлежащая ограниченная арена также закрывается; это сделает все сегменты, выделенные с помощью арены нарезки, недоступными (поскольку область видимости арены нарезки такая же, как у подлежащей ограниченной арены):class SlicingArena implements Arena {
final Arena arena = Arena.ofConfined();
final SegmentAllocator slicingAllocator;
SlicingArena(long size) {
slicingAllocator = SegmentAllocator.slicingAllocator(arena.allocate(size));
}
public MemorySegment allocate(long byteSize, long byteAlignment) {
return slicingAllocator.allocate(byteSize, byteAlignment);
}
public MemorySegment.Scope scope() {
return arena.scope();
}
public void close() {
arena.close();
}
}
try (Arena slicingArena = new SlicingArena(1000)) {
for (int i = 0; i < 10; i++) {
MemorySegment s = slicingArena.allocateArray(JAVA_INT, 1, 2, 3, 4, 5);
...
}
} // all memory allocated is released here
- Требования к реализации:
- Реализации этого интерфейса потокобезопасны.
- С:
- 20
- См. также:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
default MemorySegmentPREVIEW |
allocate |
Возвращает сегмент системной памяти заданного размера (в байтах) и ограничения выравнивания (в байтах). |
void |
close() |
Закрывает эту арену. |
static ArenaPREVIEW |
global() |
Получает глобальную арену. |
static ArenaPREVIEW |
ofAuto() |
Создаёт новую арену, которая управляется сборщиком мусора автоматически. |
static ArenaPREVIEW |
ofConfined() |
Возвращает новую ограниченную арену. |
static ArenaPREVIEW |
ofShared() |
Возвращает новую совместную арену. |
MemorySegment.ScopePREVIEW |
scope() |
Возвращает область видимости арены. |
Методы, объявленные в интерфейсе java.lang.foreign.SegmentAllocatorПРЕДПРОСМОТР
allocate, allocate, allocate, allocate, allocate, allocate, allocate, allocate, allocate, allocate, allocateArray, allocateArray, allocateArray, allocateArray, allocateArray, allocateArray, allocateArray, allocateArray, allocateUtf8String
Подробное описание методов
ofAuto
static ArenaPREVIEW ofAuto()
close() для возвращённой арены приведёт к исключению UnsupportedOperationException.- Возвращает:
- новую арену, управляемую автоматически сборщиком мусора.
global
static ArenaPREVIEW global()
close() для возвращённой арены приведёт к исключению UnsupportedOperationException.- Возвращает:
- глобальную арену.
ofConfined
static ArenaPREVIEW ofConfined()
- Возвращает:
- новую ограниченную арену
allocate
default MemorySegmentPREVIEW allocate(long byteSize, long byteAlignment)
addressПРЕВЬЮ — это начальный адрес выделенной области памяти вне кучи, поддерживающей сегмент, и адрес выровнен в соответствии с предоставленным ограничением выравнивания.- Задано в:
-
allocateв интерфейсеSegmentAllocatorPREVIEW - Требования к реализации:
- Реализации этого метода должны возвращать сегмент нативной памяти с запрошенным размером и совместимый с заданным ограничением выравнивания. Кроме того, для любых двух сегментов
S1, S2возвращаемых этим методом, должно выполняться следующее инвариантное условие:S1.asOverlappingSlice(S2).isEmpty() == true - Параметры:
-
byteSize- размер (в байтах) области памяти вне кучи, поддерживающей сегмент нативной памяти. -
byteAlignment- ограничение выравнивания (в байтах) области памяти вне кучи, поддерживающей сегмент нативной памяти. - Возвращает:
- новый сегмент нативной памяти.
- Исключения:
-
IllegalArgumentException- еслиbytesSize < 0,byteAlignment <= 0, или еслиbyteAlignmentне является степенью двойки. -
IllegalStateException- если эта арена уже была закрыта. -
WrongThreadException- если эта арена ограничена, и этот метод вызван из потока, отличного от владеющего потока арены.
scope
MemorySegment.ScopePREVIEW scope()
- Возвращает:
- область аренды
close
void close()
- Задано в:
-
closeв интерфейсеAutoCloseable - Примечание API:
- Эта операция не идемпотентна; то есть, закрытие уже закрытой арены всегда приводит к возникновению исключения. Это является осознанным дизайнерским выбором: не закрытие арены может выявить ошибку в логике приложения.
- Требования к реализации:
- Если этот метод завершится успешно, то
this.scope().isAlive() == false. Реализации могут выбрасыватьUnsupportedOperationException, если явная операция закрытия не поддерживается. - Исключения:
-
IllegalStateException- если арена уже была закрыта. -
IllegalStateException- если к сегменту, связанному с этой арендой, осуществляется одновременный доступ, например, с помощью обработчика вызова внизПРЕВЬЮ. -
WrongThreadException- если эта арена ограничена, и этот метод вызван из потока, отличного от владеющего потока арены. -
UnsupportedOperationException- если эту арену нельзя закрыть явно. - См. также:
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/foreign/Arena.html
Arenaтолько при включении функций предварительного просмотра.