用于将 Java 记录快速映射到本机内存的库

2026-05-11 1 阅读 joe_mwangi
TypedMemory Java 25 及更高版本的类型化堆外内存。 TypedMemory 是一个 Java 库,用于通过强类型视图处理连续的堆外内存。它基于 Java 外部函数和内存 (FFM) API 构建,允许您使用简单、富有表现力的 API 将 Java 记录类型映射到本机内存。 TypedMemory 无需手动管理每个结构的布局、偏移量和低级访问模式,而是为您提供类型安全的内存抽象,同时仍然保留系统、互操作、图形、模拟和面向数据的编程所需的低级控制。导入模块 com .曼巴。打字记忆; record Point ( float x , float y ) {} void main () { try ( Arena arena = Arena .ofConfined ()) { Mem 点 = Mem 。 of (Point.class,arena,10);点。设置 ( 0 , 新点 ( 5 , 3 ) );点 点 = 点 。得到(0); IO 。 println( 点 );为什么使用 TypedMemory?在 Java 中直接使用原始内存非常强大,但通常很冗长且重复。 TypedMemory 旨在通过提供以下功能使堆外编程感觉更自然: 连续内存上的强类型视图 用于描述结构化数据的基于记录的模式 对分配和生命周期的显式控制 用于本机互操作的低级布局保留 用于快速初始化和复制的批量操作 接近 FFM 模型的设计,而不完全隐藏内存概念 这使其适用于: 本机互操作 面向数据的编程 高性能内存布局 模拟和游戏/图形工作负载 存储的大型结构化数据集堆外功能 将 Java 记录类型映射到连续的堆外内存 使用 Arena 分配内存 使用 get(index) / set(index, value) 读取和写入元素 检查生成的 MemoryLayout 包裹现有 MemorySegment 重新解释给定大小或地址的内存 填充、初始化、交换和复制内存区域 支持嵌套结构化数据 支持固定大小数组字段 Status TypedMemory 目前处于实验阶段。核心 API 已经可用,但该项目仍在不断发展,随着设计的完善,可能会带来重大变化。当前状态 已实现:类型化内存分配 记录布局派生 类型化 get/set 访问 包装现有段 重新解释 支持基本批量操作 未来功能 计划实现的功能: 除了手动使用长地址之外的指针类型字段 联合要求 由于 ClassFile API,Java 25 或更高版本。重新解释调用,您的应用程序需要命令标志才能工作。对于 jar:java --enable-native-access=ALL-UNNAMED -jar app.jar 对于命名模块:java --enable-native-access=your.module.name -m your.module.name/com.example.Main Build TypedMemory 使用 Maven 构建,目标为 Java 25。 UTF-8 25 <构建> <插件> <插件> org.apache.maven.plugins maven-compiler-plugin<版本>3.11.0org.apache.maven.pluginsmaven-surefire-plugin<版本>3.2.5 编译库:mvn cleancompile 运行测试:mvntest 构建 jar:mvncleanpackage 将 TypedMemory 安装到本地 Maven 存储库中:mvncleaninstall 在 Maven 项目/安装中使用 TypedMemory 可从 Maven Central 获取,因此您可以将其直接添加到项目的 pom.xml 中: < dependency > < groupId >io.github.mambastudio typedmemory0.1.0 如果您的应用程序使用 Java 模块系统,请将其添加到 module-info.java :需要 com 。曼巴。打字记忆;快速示例导入模块 com .曼巴。打字记忆;记录颜色 ( 浮点 r , 浮点 g , 浮点 b , 浮点 a ) { 颜色 ( 浮点 r , 浮点 g , 浮点 b ) { this ( r , g , b , 1.0f ); } } void main (){ try ( Arena arena = Arena .ofConfined ()) { Mem 颜色 = Mem 。 of ( Color . class , arena , 3 );颜色 。设置(0,新颜色(1f,0f,0f));颜色 。设置(1,新颜色(0f,1f,0f));颜色 。设置 ( 2 , 新颜色 ( 0f , 0f , 1f ));颜色c = 颜色。得到(1); IO 。打印(c); // Color[r=0.0, g=1.0, b=0.0, a=1.0] } } 结构化记录导入模块 com 的示例。曼巴。打字记忆; record Pixel ( int i , int j ) {} record Point ( byte x , @size ( 3 ) Pixel [] y , @size ( 3 ) int [] z ) {} void main (){ try ( Arena arena = Arena . ofConfined ()) { Mem 点 = Mem 。 of (Point.class,arena,10);点。 set(0,newPoint((byte)7,newPixel[]{newPixel(1,2),newPixel(3,4),newPixel(5,6)},newint[]{10,20,30}));点 p = 点 。得到(0); IO 。打印(p);布局内省 TypedMemory 保留底层内存布局,使其