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 ClayLuke 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 堆空间之外的原生内存中。

流程

  1. 修改您的缓存配置以使用现成内存。

    • 声明:将 storage="OFF_HEAP" 属性添加到 memory 元素。
    • programmatic :在 MemoryConfigurationBuilder 类中调用 storage (OFF_HEAP) 方法。
  2. 通过配置 max-countmax-size 驱除来限制缓存可以使用的非堆内存量。
按大小限制的 off-heap 内存

声明性配置

<distributed-cache name="off_heap" mode="SYNC">
  <memory storage="OFF_HEAP"
          max-size="1.5GB"
          when-full="REMOVE"/>
</distributed-cache>
Copy to Clipboard Toggle word wrap

编程配置

ConfigurationBuilder cfg = new ConfigurationBuilder();

cfg
  .memory()
    .storage(StorageType.OFF_HEAP)
    .maxSize("1.5GB")
    .whenFull(EvictionStrategy.REMOVE)
  .build());
Copy to Clipboard Toggle word wrap

由条目总数绑定的非堆内存

声明性配置

<distributed-cache name="off_heap" mode="SYNC">
  <memory storage="OFF_HEAP"
          max-count="500"
          when-full="REMOVE"/>
</distributed-cache>
Copy to Clipboard Toggle word wrap

编程配置

ConfigurationBuilder cfg = new ConfigurationBuilder();

cfg
  .memory()
    .storage(StorageType.OFF_HEAP)
    .maxCount(500)
    .whenFull(EvictionStrategy.REMOVE)
  .build());
Copy to Clipboard Toggle word wrap

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部