Spec-Zone.ru › OpenJDK 21

Интерфейс Arena

Все суперинтерфейсы:
AutoCloseable, SegmentAllocatorPREVIEW
public interface Arena extends SegmentAllocatorPREVIEW, AutoCloseable
Arena — это API предварительного просмотра платформы Java.
Программы могут использовать Arena только при включении функций предварительного просмотра.
Функции предварительного просмотра могут быть удалены в будущих выпусках или обновлены до постоянных функций платформы 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
См. также:
  • MemorySegmentПРЕДПРОСМОТР

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

Модификатор и тип Метод Описание
default MemorySegmentPREVIEW allocate(long byteSize, long byteAlignment)
Возвращает сегмент системной памяти заданного размера (в байтах) и ограничения выравнивания (в байтах).
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()
Возвращает новую ограниченную арену. Сегменты, выделенные с помощью ограниченной арены, могут быть доступныПРЕВЬЮ потоку, который создал арену, владеющему потоку арены.
Возвращает:
новую ограниченную арену

ofShared

static ArenaPREVIEW ofShared()
Возвращает новую общую арену. Сегменты, выделенные с помощью глобальной арены, могут быть доступныПРЕВЬЮ любому потоку.
Возвращает:
новую общую арену

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 - если эту арену нельзя закрыть явно.
См. также:
  • MemorySegment.Scope.isAlive()ПРЕВЬЮ

© 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

Spec-Zone.ru

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