Java 中启用持久内存使用总结
动机
Java 作为服务器端流行的语言,尤其在数据库(如 Apache Lucene、Spark、HDFS、Cassandra、Ignite、HBase 等)应用中,通过持久内存技术可提供更好的性能和持久性支持。
持久性或挥发性使用
Java 提供多种方式访问持久内存:
- 持久性映射文件缓冲区(Persistent MappedByteBuffer)
- 低级持久性库(LLPL)
- Java 持久集合(PCJ)
- 替代内存设备上的 Java 堆分配(包括整个堆和新/旧发电机分割)
低级持久性库 (LLPL) 和 Java 持久集合 (PCJ)
| 特性 |
LLPL |
PCJ |
| GitHub |
github.com/pmem/llpl |
github.com/pmem/pcj |
| 持久性数据 |
内存块 |
集合和其他对象 |
| 内存管理 |
手动 |
自动 |
| 线程安全 |
是 |
是 |
| 数据一致性 |
协助内置或用户定义事务性方法政策 |
用户定义 ACID 事务性方法政策 |
| 堆 API 安全性 |
用户定义 |
线程安全 |
用户事务 API
- 提供设置/获取 Java 标量、复制字节、分配和释放持久性内存块等功能。
- 支持三种堆类型:交易式堆(中断回滚)、持久化堆(持久性修改)、自定义一致性方案下的持久化堆。
LLPL 示例代码
提供 LLPL 的示例代码,展示如何使用低级持久性库进行持久内存操作。
PM 存储引擎与 Cassandra
Cassandra 作为 Java 编写的分布式 NoSQL 数据库,可通过持久内存存储引擎(PM 存储引擎)简化代码并提升性能。
- 写入路径:基于日志结构化合并树,PM 存储引擎优化写入性能。
- 读取路径:通过 PM 存储引擎加速数据读取。
- 软件支持:Cassandra 可插拔存储引擎设计,支持 PM 存储后端。
基于 PCJ 的持久性类
PCJ 提供持久性类库,支持对象状态持久化:
- 持久性类示例:包括 PersistentArray、PersistentArrayList、PersistentHashMap 等。
- 事务 API:通过事务性 Java 方法完成持久性状态更改。
- 垃圾收集:基于可达性的生命周期管理。
PCJ 示例代码
提供 PCJ 的示例代码,展示如何使用持久性类进行事务操作。
持久内存开发套件的使用
PCJ 和 LLPL 库依赖 PMDK(持久内存开发套件),包括内存分配、缓存刷新和事务支持等功能。
数据依赖性、寿命和完整性
- 数据依赖关系:驱动依赖数据生存期的下限。
- 数据可用性:事后可用性需更强的读/写机制。
- 事件和事件后状态:包括未定义的重新初始化、已处理的异常、硬件故障、电源故障等。
总结
Cassandra 持久内存存储引擎展示了简洁性和性能优势,可插拔存储 API 未来支持备用存储后端。LLPL 和 PCJ 等库使 Java 开发者可编程持久性内存,提供事务支持和对象持久化功能。