2.6. JVM 堆和非堆内存


默认情况下,Data Grid 将缓存条目存储在 JVM 堆内存中。您可以将 Data Grid 配置为使用下游存储,这意味着您的数据在受管 JVM 内存空间外占用原生内存。

下图显示了运行 Data Grid 的 JVM 进程的内存空间的简化:

图 2.1. JVM 内存空间

本图描述了 JVM 内存空间划分为堆和非堆内存。

JVM 堆内存

堆被分为您和旧的生成,可帮助在内存中保留引用的 Java 对象和其他应用程序数据。GC 进程从无法访问的对象回收空间,并在您的生成内存池中更频繁地运行。

当 Data Grid 将缓存条目存储在 JVM 堆内存中时,GC 运行可能需要更长时间才能完成,因为开始将数据添加到缓存中。因为 GC 是一个密集型进程,所以更长且更频繁的运行可能会降低应用程序性能。

离线内存

脱机内存是 JVM 内存管理之外的原生可用内存。JVM 内存空间 图显示包含类元数据并从原生内存分配的 Metaspace 内存池。图也代表了包含 Data Grid 缓存条目的原生内存部分。

离线内存:

  • 每个条目使用较少的内存。
  • 通过避免 Garbage Collector (GC)运行来提高整体 JVM 性能。

但是,一个缺点是 JVM 堆转储不显示存储在非堆内存中的条目。

2.6.1. 离线数据存储

当您向离线缓存中添加条目时,Data Grid 会动态为您的数据分配原生内存。

Data Grid 将每个密钥的序列化 字节[] 哈希散列到与标准 Java HashMap 类似的存储桶中。bucket 包括数据中心用来查找存储在非堆内存中的条目的地址指针。

重要

虽然数据平面将缓存条目存储在原生内存中,但运行时操作需要这些对象的 JVM 堆表示。例如,cache.get () 操作会在返回前将对象读取为堆内存。同样,状态传输操作会在堆内存中保存对象的子集。

对象相等

Data Grid 使用每个对象的 serialized byte[] 表示(而非对象实例)决定非堆存储中的 Java 对象的相等性。

数据一致性

Data Grid 使用一组锁定来保护堆的地址空间。锁定数量是内核数的两倍,然后舍入到最接近的 2 的指数。这样可确保 ReadWriteLock 实例甚至分发,以防止写入操作阻止读操作。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.