9.2. エビクション
エビクションは、Data Grid が使用するメモリー量を管理する方法を提供します。
Data Grid を使用すると、データコンテナーの最大サイズを設定できます。エビクションはキャッシュからエントリーを削除し、Data Grid が最大サイズを超えないようにします。
エビクションはメモリーからエントリーを削除しますが、永続的なキャッシュストアからは削除しません。
9.2.1. エビクションの仕組み
Data Grid エビクションは、データコンテナーからエントリーを削除して、新規エントリーを追加するときに領域を作成します。
データの損失を防ぐために、エビクションを有効にする場合、常に永続キャッシュストアを設定する必要があります。
Data Grid エビクションは、以下の 2 つの設定に依存します。
- データコンテナーのサイズ。
- エビクションストラテジー
データコンテナーサイズの算出
データコンテナーの最大サイズを設定し、Data Grid がキャッシュエントリーを以下のように保存するかどうかを指定します。
- Java ヒープのオブジェクト。
-
Java ヒープのバイナリー
byte[]
- ネイティブメモリーのバイト (オフヒープ)。
ストレージタイプ | データコンテナーのサイズは以下のように計算されます。 |
---|---|
オブジェクト | エントリー数 |
バイナリー |
エビクションタイプが |
off-heap |
エビクションタイプが |
MEMORY
を使用する場合、Data Grid は HotSpot JVM に対して最適化されたデータコンテナーの概算サイズのみを判別できます。
オフヒープストレージで MEMORY
を使用する場合、計算はヒープ上の近似値になります。
キャッシュエントリーのエビクト
データコンテナーでエントリーが追加または変更されると、Data Grid は現在のエビクションサイズを最大サイズと比較します。現在のサイズが最大値を超えると、Data Grid はエントリーをエビクトします。
エビクションは、最大サイズを超えるエントリーを追加するスレッドですぐに行われます。
たとえば、以下の設定について考えてみましょう。
<memory> <object size="50" /> </memory>
この場合、エントリーはオブジェクトとして保存され、データコンテナーの最大サイズは 50 エントリーです。
データコンテナーに 50 エントリーがあり、put()
リクエストが新規エントリーの作成を試みると、Data Grid はエビクションを実行します。
エビクションストラテジー
ストラテジーは、Data Grid のエビクションを実行する方法を制御します。エビクションは手動で実行することも、Data Grid を以下のいずれかを実行するように設定したりできます。
- 古いエントリーを削除して、新しいエントリー用の領域を作成します。
ContainerFullException
を出力し、新規エントリーが作成されないようにします。例外エビクションストラテジーは、2 フェーズコミットを使用するトランザクションキャッシュでのみ動作しますが、1 フェーズコミットまたは同期の最適化とは関係しません。
Data Grid には、TinyLFU と呼ばれる Least Frequently Used (LFU) キャッシュ置換アルゴリズムのバリエーションを実装する Caffeine キャッシングライブラリーが含まれています。オフヒープストレージの場合、Data Grid は LeastRecent Used (LRU) アルゴリズムのカスタム実装を使用します。
References