S-JIS[2024-09-23] 変更履歴

Java外部関数およびメモリーAPI Arena

Java外部関数およびメモリーAPIのArenaのメモ。


概要

Arena(アリーナ)は、 ネイティブメモリーセグメント(Java管理外のメモリー領域)のライフサイクルを制御するインターフェース。
アリーナを使ってメモリーを確保する。

import java.lang.foreign.Arena;

ArenaはAutoCloseableを継承しているが、Arenaインスタンスの取得方法によっては、closeメソッドを呼ぶ必要は無い。
というか、呼ぶとUnsupportedOperationExceptionが発生するケースがある。


ArenaはSegmentAllocatorを継承しているので、SegmentAllocatorを引数に取るメソッドにはArenaを渡すことが出来る。


Arenaの取得方法

メソッド 説明 クローズ
Arena ofAuto() GCによって管理されるアリーナを生成する。
「このアリーナによって返された全てのMemorySegment」と「このアリーナ自身」がどこからも参照されなくなったら、メモリーを解放する。
禁止
var arena = Arena.ofAuto();
Arena global() グローバルアリーナ(有効期間が無制限)を取得する。 禁止
var arena = Arena.global();
Arena ofConfined() 限定アリーナを生成する。
このアリーナを作ったスレッドのみで有効。
close()
try (var arena = Arena.ofConfined()) {
    〜
}
Arena ofShared() スレッド間で共有できるアリーナを生成する。
close()
try (var arena = Arena.ofShared()) {
    〜
}

Arenaのメソッド

メソッド 説明
MemorySegment allocate(long byteSize) 指定されたバイト数のメモリーを確保する。 var m = arena.allocate(256);
MemorySegment allocate(MemoryLayout layout) 指定されたレイアウトに必要なメモリーを確保する。 var m = arena.allocate(MY_STRUCT1_LAYOUT);
MemorySegment allocateFrom(〜) メモリーを確保して、Javaの値をコピーする。
色々な型のオーバーロードが存在する。
var m1 = arena.allocateFrom(ValueLayout.JAVA_INT, 123);
var m2 = arena.allocateFrom("abc"); // 末尾に'\0'が入るUTF-8
var m3 = arena.allocateFrom("abc", StandardCharsets.UTF_8); // 末尾に'\0'が入る
var m4 = arena.allocateFrom(ValueLayout.JAVA_BYTE, new byte[] { 0x12, 0x34 });
Scope scope() スコープを取得する。 boolean isAlive = arena.scope().isAlive();
void close() アリーナをクローズする。(限定アリーナ共有アリーナの場合のみ)
クローズすると、確保していたメモリーが解放され、このアリーナから返されたMemorySegmentは無効になる。
 

外部関数およびメモリーAPIへ戻る / Java目次へ戻る / 新機能へ戻る / 技術メモへ戻る
メールの送信先:ひしだま