S-JIS[2024-09-23] 変更履歴
Javaの外部関数およびメモリーAPIのArenaのメモ。
|
Arenaは、
ネイティブメモリーセグメント(Java管理外のメモリー領域)のライフサイクルを制御するインターフェース。
アリーナを使ってメモリーを確保する。
import java.lang.foreign.Arena;
ArenaはAutoCloseableを継承しているが、Arenaインスタンスの取得方法によっては、closeメソッドを呼ぶ必要は無い。
というか、呼ぶとUnsupportedOperationExceptionが発生するケースがある。
ArenaはSegmentAllocatorを継承しているので、SegmentAllocatorを引数に取るメソッドには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()) { 〜 } |
メソッド | 説明 | 例 |
---|---|---|
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); |
Scope scope() |
スコープを取得する。 | boolean isAlive = arena.scope().isAlive(); |
void close() |
アリーナをクローズする。(限定アリーナと共有アリーナの場合のみ) クローズすると、確保していたメモリーが解放され、このアリーナから返されたMemorySegmentは無効になる。 |