5.2. off-Heap Memory
默认情况下,Data Grid 将缓存条目存储在 JVM 堆内存中。您可以将 Data Grid 配置为使用非堆存储,这意味着您的数据在受管 JVM 内存空间之外占用了以下优点:
- 对相同数量的数据使用比 JVM 堆内存少。
- 可以通过避免 Garbage Collector (GC)运行来提高整体 JVM 性能。
但是,存在一些使用现成的存储权衡;例如,JVM 堆转储不显示存储在 off-heap 内存中的条目。
下图演示了运行 Data Grid 的 JVM 进程的内存空间:
图 5.1. JVM 内存空间
JVM 堆内存
堆分为年轻而旧代,可帮助在内存中保持引用的 Java 对象和其他应用数据。GC 进程从无法访问的对象回收空间,在生成内存池中更频繁地运行。
当 Data Grid 将缓存条目存储在 JVM 堆内存中时,GC 运行可能需要更长的时间才能开始向缓存中添加数据。因为 GC 是一个密集型过程,所以更频繁地运行可能会降低应用程序性能。
off-heap 内存
off-heap 内存是 JVM 内存管理之外的原生可用内存。JVM 内存空间 图显示包含类元数据且从原生内存分配的 Metaspace 内存池。该图还代表了包含 Data Grid 缓存条目的原生内存部分。
存储数据不足
当您向现成缓存中添加条目时,Data Grid 会动态地为您的数据分配原生内存。
Data Grid 将每个 键的序列化字节[] 哈希到与标准 Java HashMap 类似的存储桶中。bucket 包括 Data Grid 用来查找存储在 off-heap 内存中的条目的地址指针。
Data Grid 使用每个对象的序列化字节[]表示,而不是对象实例,以非堆存储的形式确定 Java 对象的相等性。
下图显示了一组带有名称的密钥、每个键和 bucket 数组的哈希值,以及名称和电话号码的条目:
图 5.2. 密钥的内存地址指针
当密钥哈希冲突时,Data Grid 链接条目。在 键图的 Memory address pointers 中,如果 William Clay 和 Luke Cage 键具有相同的哈希值,则添加到缓存的第一个条目是存储桶中的第一个元素。
虽然 Data Grid 将缓存条目存储在原生内存中,但运行时操作需要这些对象的 JVM 堆表示。例如,cache.get () 操作会在返回前将对象读取到堆内存中。同样,状态传输操作在堆内存中保存对象子集。
内存开销
内存开销是 Data Grid 用来存储条目的额外内存。对于非堆存储,Data Grid 对缓存中的每一条目使用 25 字节。
当您使用驱除来创建绑定的非堆数据容器时,内存开销会增加到总计 61 字节,因为 Data Grid 创建了一个额外的链接列表来跟踪缓存中的条目并执行驱除。
数据一致性
Data Grid 使用数组锁定来保护非堆地址空间。锁定的数量是内核数的两倍,然后舍入到最接近的 2 的指数。这样可确保存在 ReadWriteLock 实例甚至分配,以防止写入操作阻止读操作。
5.2.1. 使用 Off-Heap 内存 复制链接链接已复制到粘贴板!
配置 Data Grid,将缓存条目存储在 JVM 堆空间之外的原生内存中。
流程
修改您的缓存配置以使用现成内存。
-
声明:将
storage="OFF_HEAP"属性添加到memory元素。 -
programmatic :在
MemoryConfigurationBuilder类中调用storage (OFF_HEAP)方法。
-
声明:将
-
通过配置
max-count或max-size驱除来限制缓存可以使用的非堆内存量。
按大小限制的 off-heap 内存
声明性配置
<distributed-cache name="off_heap" mode="SYNC">
<memory storage="OFF_HEAP"
max-size="1.5GB"
when-full="REMOVE"/>
</distributed-cache>
<distributed-cache name="off_heap" mode="SYNC">
<memory storage="OFF_HEAP"
max-size="1.5GB"
when-full="REMOVE"/>
</distributed-cache>
编程配置
由条目总数绑定的非堆内存
声明性配置
<distributed-cache name="off_heap" mode="SYNC">
<memory storage="OFF_HEAP"
max-count="500"
when-full="REMOVE"/>
</distributed-cache>
<distributed-cache name="off_heap" mode="SYNC">
<memory storage="OFF_HEAP"
max-count="500"
when-full="REMOVE"/>
</distributed-cache>
编程配置