JEP 454:外部函数和内存 API
概括
引入一个 API,Java 程序可以通过该 API 与 Java 运行时之外的代码和数据进行互操作。通过有效地调用外部函数(即 JVM 外部的代码),并通过安全地访问外部内存(即不由 JVM 管理的内存),API 使 Java 程序能够调用本机库并处理本机数据,而不会造成脆弱性和危险。 JNI。
历史
外部函数和内存 (FFM) API 最初由JEP 424 (JDK 19)作为预览功能提出,随后由 JEP JEP 434 (JDK 20) 和JEP 442 (JDK 21) 进行完善。该 JEP 建议 根据持续的经验和反馈进一步进行小幅改进,最终确定 FFM API。在此版本中,我们有:
- 提供了一个新的链接器选项,允许客户端将堆段传递给向下调用方法句柄;
- 引入了
Enable-Native-Access
JAR 文件清单属性,允许可执行 JAR 文件中的代码调用受限方法,而无需使用--enable-native-access
命令行选项; - 使客户端能够以编程方式构建 C 语言函数描述符,避免特定于平台的常量;
- 改进了对本机内存中可变长度数组的支持;和
- 添加了对本机字符串的任意字符集的支持。
目标
-
生产力——用简洁、可读和纯 Java API取代脆弱的方法机制
native
和Java 本机接口(JNI)。 -
性能——提供对外部函数和内存的访问,其开销与 JNI 和
sun.misc.Unsafe
. -
广泛的平台支持— 允许在 JVM 运行的每个平台上发现和调用本机库。
-
一致性——提供在多种内存(例如,本机内存、持久内存和托管堆内存)中操作无限大小的结构化和非结构化数据的方法。
-
健全性——保证没有释放后使用错误,即使在多个线程之间分配和释放内存时也是如此。
-
完整性——允许程序使用本机代码和数据执行不安全的操作,但默认警告用户此类操作。