- すべてのスーパー・インタフェース:
AutoCloseable,SegmentAllocatorPREVIEW
MemorySessionは、JavaプラットフォームのプレビューAPIです。
MemorySegmentPREVIEW)には、メモリー・セッションがaliveであり、メモリー・セッション(もしあれば)に関連付けられた「スレッド」によってのみアクセスできます。
メモリー・セッションはクローズできます。 メモリー・セッションが閉じられると、aliveではなくなり、そのセッション(例、MemorySegmentPREVIEWインスタンスにアクセスしようとしています)に関連付けられたリソースに対する後続の演算がIllegalStateExceptionで失敗します。
メモリー・セッションは、1つ以上の「アクションを閉じる」に関連付けられます。 クローズ・アクションを使用して、特定のリソース(またはリソースのセット)が使用されなくなった場合に実行する必要があるクリーンアップ・コードを指定できます。 メモリー・セッションが閉じられると、そのセッションに関連付けられた「アクションを閉じる」が(未指定の順序)に実行されます。 たとえば、1つ以上の「ネイティブ・メモリー・セグメント」PREVIEWに関連付けられたメモリー・セッションを閉じると、そのセグメントに関連付けられたオフ・ヒープ・メモリーが解放されます。
「グローバル・セッション」は、クローズできないメモリー・セッションです。 その結果、グローバル・セッションに関連付けられたリソースはリリースされません。 グローバル・メモリー・セッションに関連付けられたリソースの例は、「ヒープ・セグメント」PREVIEWです。
スレッド制限
メモリー・セッションは2つのカテゴリに分けることができます: 「スレッド制限」メモリー・セッションおよび「共有」メモリー・セッション。
制限付きメモリー・セッション、強いスレッド制限保証のサポート。 作成時に、「所有者スレッド」(通常は作成演算を開始したスレッド)が割り当てられます。 制限付きメモリー・セッションを作成したあと、所有者スレッドのみが、このメモリー・セッションに関連付けられたリソースを直接操作できます。 所有者スレッド以外のスレッドからリソース・アクセスを実行しようとすると、WrongThreadExceptionで失敗します。
一方、共有メモリー・セッションには所有者スレッドはありません。そのため、共有メモリー・セッションに関連付けられたリソースには複数のスレッドからアクセスできます。 これは、複数のスレッドが同じリソース (例:パラレル処理の場合)に同時にアクセスする必要がある場合に役立ちます。
クローズ可能なメモリー・セッション
セッションがオフ・ヒープ・リソースに関連付けられている場合、ガベージ・コレクタによってunreachableとみなされるセッションを待機するのではなく、そのようなリソースを適時にリリースすることが望ましい場合があります。 このシナリオでは、クライアントは「クローズ可能」メモリー・セッションの使用を検討します。 クローズ可能なメモリー・セッションは、次の例に示すように、決定的にclosedになる可能性があるメモリー・セッションです:try (MemorySession session = MemorySession.openConfined()) {
MemorySegment segment1 = MemorySegment.allocateNative(100);
MemorySegment segment1 = MemorySegment.allocateNative(200);
...
} // all memory released here
クローズ可能なメモリー・セッションは強力ですが、注意して使用する必要があります。 クローズ可能なメモリー・セッションは、明示的に(close()メソッドをコール)または暗黙的に(「try-with-resourcesコンストラクト」でクローズ可能なメモリー・セッションの使用をラップ)のいずれかが使用されなくなったときにクローズする必要があります。 そうしないと、メモリー・リークが発生する可能性があります。 この問題を軽減するために、クローズ可能なメモリー・セッションをCleanerインスタンスに関連付けて、セッション・インスタンスがunreachableになったら自動的にクローズされるようにできます。 これは、偶発的なネイティブ・メモリー・リークを防止しながら、予測可能な確定的リソース・ロケーションを許可するのに役立ちます。 クリーナによって管理されるメモリー・セッションをクライアントがクローズした場合、セッションが到達不可能になったとき、これ以上のアクションは実行されません。つまり、メモリー・セッションに関連付けられた「アクションを閉じる」は、管理対象かどうかに関係なく、「1回のみ」と呼ばれます。
非クローズ可能なビュー
メモリー・セッションが関連付けられている1つ以上のリソースからアクセス可能になることが望ましくない場合があります。 たとえば、APIではプライベート・メモリー・セッションを作成し、メモリー・セグメントを割り当て、このセグメントの1つ以上のスライスをクライアントに公開できます。 APIメモリー・セッションはスライス(MemorySegment.session()PREVIEWアクセサの使用)から到達可能であるため、クライアントがAPI (例、セッションを途中で閉じます)を危険にさらす可能性があります。 プライベート・メモリー・セッションが信頼できないクライアントに漏れないように、APIでは、次のように、作成したセッションのクローズ不可ビューに基づいてセグメントを戻すことができます:
MemorySession session = MemorySession.openConfined();
MemorySession nonCloseableSession = session.asNonCloseable();
MemorySegment segment = MemorySegment.allocateNative(100, nonCloseableSession);
segment.session().close(); // throws
session.close(); //ok
sessionオブジェクトの所有者のみがセッションをクローズできます。 外部クライアントはクローズ不可セッションにのみアクセスでき、基礎となるAPIセッションにはアクセスできません。 - 実装要件:
- このインタフェースの実装はスレッド・セーフです。
- 導入されたバージョン:
- 19
- 関連項目:
-
メソッドのサマリー
修飾子と型メソッド説明voidaddCloseAction(Runnable runnable) メモリー・セッションが閉じられるときに実行されるカスタム・クリーン・アップ・アクションを追加します。default MemorySegmentPREVIEWallocate(long bytesSize, long bytesAlignment) このセッションを使用してネイティブ・セグメントを割り当てます。このメモリー・セッションを閉じられないビューを返します。voidclose()このメモリー・セッションを閉じます。boolean指定されたオブジェクトをこのメモリー・セッションと比較し、等しいかどうかを調べます。static MemorySessionPREVIEWglobal()グローバル・メモリー・セッションを返します。inthashCode()このメモリー・セッションのハッシュ・コード値を返します。booleanisAlive()このメモリー・セッションが有効な場合は、trueを返します。booleanこのセッションがクローズ可能なメモリー・セッションである場合は、trueを返します。static MemorySessionPREVIEW閉じた制限付きメモリー・セッションを作成します。static MemorySessionPREVIEWopenConfined(Cleaner cleaner) 指定されたクリーナ・インスタンスによって管理されるクローズ可能な制限付きメモリー・セッションを作成します。static MemorySessionPREVIEWプライベートCleanerインスタンスによって管理されるクローズ不可の共有メモリー・セッションを作成します。static MemorySessionPREVIEWクローズ可能な共有メモリー・セッションを作成します。static MemorySessionPREVIEWopenShared(Cleaner cleaner) 指定されたクリーナ・インスタンスによって管理されるクローズ可能な共有メモリー・セッションを作成します。このメモリー・セッションに関連付けられた所有者スレッドを返します。このセッションが複数のスレッドで共有されている場合はnullを返します。voidwhileAlive(Runnable action) このメモリー・セッションが存続している間に重要なアクションを実行します。インタフェースjava.lang.foreign.SegmentAllocatorPREVIEWで宣言されたメソッド
allocate, allocate, allocate, allocate, allocate, allocate, allocate, allocate, allocate, allocate, allocateArray, allocateArray, allocateArray, allocateArray, allocateArray, allocateArray, allocateArray, allocateArray, allocateUtf8String
-
メソッドの詳細
-
isAlive
boolean isAlive()このメモリー・セッションが有効な場合は、trueを返します。- 戻り値:
true。このメモリー・セッションが有効である場合
-
isCloseable
boolean isCloseable()このセッションがクローズ可能なメモリー・セッションである場合は、trueを返します。- 戻り値:
true(このセッションがクローズ可能なメモリー・セッションの場合)
-
ownerThread
Thread ownerThread()このメモリー・セッションに関連付けられた所有者スレッドを返します。このセッションが複数のスレッドで共有されている場合はnullを返します。- 戻り値:
- このメモリー・セッションに関連付けられた所有者スレッド、またはこのセッションが複数のスレッドで共有されている場合は
null
-
whileAlive
void whileAlive(Runnable action) このメモリー・セッションが存続している間に重要なアクションを実行します。- パラメータ:
action- 実行するアクション。
-
addCloseAction
void addCloseAction(Runnable runnable) メモリー・セッションが閉じられるときに実行されるカスタム・クリーン・アップ・アクションを追加します。 メモリー・セッションが閉じられるとカスタム・クリーン・アップ・アクションが呼び出される順序は不確定です。- APIのノート:
- 指定されたアクションでは、暗黙的に閉じられたセッションを
Cleanerインスタンスで正しく処理できるように、このメモリー・セッションへの強力な参照を保持しないでください。 - パラメータ:
runnable- このメモリー・セッションに関連付けるカスタム・クリーン・アップ・アクション。- 例外:
IllegalStateException- このメモリー・セッションがaliveでない場合。WrongThreadException- このメソッドが、このメモリー・セッションを「所有している」スレッド以外から呼び出された場合。
-
close
void close()このメモリー・セッションを閉じます。 この演算が例外なしで完了すると、このセッションは「生きていない」としてマークされ、このセッションに関連付けられた「アクションを閉じる」が実行され、このセッションに関連付けられたすべてのリソースが解放されます。- 定義:
close、インタフェースAutoCloseable- APIのノート:
- この演算はべき等ではありません。つまり、すでに閉じたメモリー・セッションalwaysを閉じると、例外がスローされます。 これは意図的な設計の選択を反映しています: メモリー・セッションの状態遷移はクライアント・コード内でマニフェスト化する必要があります。これらの遷移のいずれかに失敗すると、基礎となるアプリケーション・ロジックのバグが明らかになります。
- 例外:
IllegalStateException- このメモリー・セッションがaliveでない場合。IllegalStateException- このセッションが別のクライアントによって「キープ・アライブ」である場合。WrongThreadException- このメソッドが、このメモリー・セッションを「所有している」スレッド以外から呼び出された場合。UnsupportedOperationException- このメモリー・セッションが「クローズ可能」でない場合。- 関連項目:
-
asNonCloseable
MemorySessionPREVIEW asNonCloseable()このメモリー・セッションを閉じられないビューを返します。 このセッションがnon-closeableの場合、このセッションが返されます。 それ以外の場合、このメソッドは、このメモリー・セッションを閉じられないビューを返します。- APIのノート:
- メモリー・セッション
Sのクローズ不可能なビューは、Sにアクセス可能なままにします。 したがって、Sの1つ以上のクローズ不可能なビューに到達できるかぎり、Sを暗黙的に(例、Cleanerにより)にクローズすることはできません。 - 戻り値:
- このメモリー・セッションを閉じられないビュー。
-
equals
boolean equals(Object that) 指定されたオブジェクトをこのメモリー・セッションと比較し、等しいかどうかを調べます。 指定されたオブジェクトがメモリー・セッションでもあり、このメモリー・セッションと同じメモリー・セッションを参照する場合のみ、trueを返します。 メモリー・セッションSの「非クローズ可能なビュー」Vは、Sと等しいとみなされます。 -
hashCode
int hashCode()このメモリー・セッションのハッシュ・コード値を返します。 -
allocate
default MemorySegmentPREVIEW allocate(long bytesSize, long bytesAlignment) このセッションを使用してネイティブ・セグメントを割り当てます。 次のコードと同等です:MemorySegment.allocateNative(size, align, this);- 定義:
- インタフェース
SegmentAllocatorPREVIEW内のallocate - パラメータ:
bytesSize- 割り当てるメモリー・ブロックのサイズ(バイト単位)。bytesAlignment- 割り当てるメモリー・ブロックの整列(バイト単位)。- 戻り値:
- このセッションに関連付けられた新しいネイティブ・セグメント。
- 例外:
IllegalStateException- このメモリー・セッションがaliveでない場合。WrongThreadException- このメソッドが、このメモリー・セッションを「所有している」スレッド以外から呼び出された場合。
-
openConfined
static MemorySessionPREVIEW openConfined()閉じた制限付きメモリー・セッションを作成します。- 戻り値:
- 新しい閉じた制限付きメモリー・セッション。
-
openConfined
static MemorySessionPREVIEW openConfined(Cleaner cleaner) 指定されたクリーナ・インスタンスによって管理されるクローズ可能な制限付きメモリー・セッションを作成します。- パラメータ:
cleaner- 返されたメモリー・セッションに関連付けるクリーナ。- 戻り値:
cleanerによって管理される新しいクローズ可能な制限付きメモリー・セッション。
-
openImplicit
static MemorySessionPREVIEW openImplicit()プライベートCleanerインスタンスによって管理されるクローズ不可の共有メモリー・セッションを作成します。 (ただし、より効率的である可能性があります。)と同等のコードは次のとおりです:openShared(Cleaner.create()).asNonCloseable();- 戻り値:
- プライベート
Cleanerインスタンスによって管理される、クローズ不可能な共有メモリー・セッション。
-
global
static MemorySessionPREVIEW global()グローバル・メモリー・セッションを返します。- 戻り値:
- グローバル・メモリー・セッション。
-
MemorySessionを使用できます。