2.6. JVM 堆和非堆内存
默认情况下,Data Grid 将缓存条目存储在 JVM 堆内存中。您可以将 Data Grid 配置为使用下游存储,这意味着您的数据在受管 JVM 内存空间外占用原生内存。
下图显示了运行 Data Grid 的 JVM 进程的内存空间的简化:
图 2.1. 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
实例甚至分发,以防止写入操作阻止读操作。