Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JDK21更新内容:ForeignFunctionAndMemoryApi

JDK21更新内容:ForeignFunctionAndMemoryApi

作者头像
程序员朱永胜
发布于 2023-09-25 00:14:14
发布于 2023-09-25 00:14:14
66500
代码可运行
举报
运行总次数:0
代码可运行

1. 什么是Foreign Function & Memory API (Third Preview)?

Foreign Function & Memory APIJava 平台的一个功能,它允许开发者直接与本地代码进行交互,并且可以在 Java 中操作本地内存。这个功能最初在 JDK 14 的时候以 JEP 383 的形式引入了第一次预览版,然后在 JDK 15 中进一步改进并发布了第二次预览版(JEP 393),现在在 JDK 21 中发布了第三次预览版(JEP 442)。

2. 为什么需要Foreign Function & Memory API?

Foreign Function & Memory API 的出现主要是为了解决以下几个问题:

  • 与本地代码的无缝集成:有些场景下,我们可能需要调用本地库或者系统级别的函数,例如使用硬件加速、调用底层操作系统的特定功能等。而 Foreign Function & Memory API 可以使得 Java 程序能够直接调用本地函数,从而实现与本地代码的无缝集成。
  • 提高性能:通过直接操作本地内存,可以避免数据拷贝和类型转换带来的性能损耗,从而提高程序的执行效率。
  • 扩展现有 Java 库的功能:Foreign Function & Memory API 提供了一种机制,可以将本地库中的函数包装成 Java 接口,从而方便地扩展现有的 Java 库的功能。

3. Foreign Function & Memory API 的实现原理

Foreign Function & Memory API 的实现主要依赖于以下几个关键技术:

  • JNI(Java Native Interface):JNI 是 Java 平台提供的一种机制,用于在 Java 程序中调用本地代码。Foreign Function & Memory API 利用 JNI 提供的能力,使得 Java 程序可以直接调用本地函数。
  • 内存管理:Foreign Function & Memory API 允许开发者直接操作本地内存,包括分配、释放和读写等操作。这需要对内存进行有效的管理,以确保安全性和可靠性。
  • 类型映射:由于 Java 和本地代码使用不同的数据类型表示数据,因此需要进行类型映射。Foreign Function & Memory API 提供了一套规则和工具,用于将 Java 类型与本地类型进行转换。

4. Foreign Function & Memory API 的优点

  • 无缝集成:Foreign Function & Memory API 可以使得 Java 程序能够直接调用本地函数,从而实现与本地代码的无缝集成。
  • 高性能:通过直接操作本地内存,避免了数据拷贝和类型转换带来的性能损耗,从而提高程序的执行效率。
  • 灵活性:Foreign Function & Memory API 提供了丰富的功能和灵活的接口,可以满足不同场景下的需求。

5. Foreign Function & Memory API 的缺点

  • 安全性风险:直接操作本地内存可能会带来一些安全风险,例如内存泄漏、访问非法内存等。因此,在使用 Foreign Function & Memory API 时需要谨慎处理,并遵循相关的安全规范。
  • 复杂性:Foreign Function & Memory API 涉及到与本地代码的交互和内存管理等复杂的问题,对开发者的要求较高,需要具备一定的底层编程知识和经验。

6. Foreign Function & Memory API 的使用示例

以下是一个简单的示例,展示了如何使用 Foreign Function & Memory API 调用本地函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jdk.incubator.foreign.*;

public class NativeFunctionExample {
    public static void main(String[] args) throws Exception {
        try (MemorySegment segment = MemorySegment.allocateNative(4)) {
            CLinker linker = CLinker.getInstance();
            FunctionDescriptor descriptor = FunctionDescriptor.of(CLinker.C_INT, CLinker.C_POINTER);
            LibraryLookup lookup = LibraryLookup.ofDefault();
            Symbol symbol = lookup.lookup("printf");
            FunctionHandle handle = linker.downcallHandle(symbol, descriptor);
            
            String message = "Hello, World!";
            MemoryAccess.setCString(segment.baseAddress(), message);
            int result = (int) handle.invokeExact(segment.baseAddress());
            
            System.out.println("Result: " + result);
        }
    }
}

上述示例中,我们使用 Foreign Function & Memory API 调用了本地的 printf 函数,并将结果打印出来。

7. Foreign Function & Memory API 的使用注意事项

  • 在使用 Foreign Function & Memory API 时,需要确保本地函数和库已经正确安装并可用。
  • 对于直接操作本地内存的情况,需要特别注意内存管理和安全性问题,避免出现内存泄漏、访问非法内存等问题。
  • 使用 Foreign Function & Memory API 需要谨慎处理异常,以确保程序的稳定性和可靠性。

8. 总结

Foreign Function & Memory API 是 Java 平台提供的一种机制,可以使得 Java 程序能够直接调用本地函数,并且可以在 Java 中操作本地内存。它通过 JNI 技术实现与本地代码的无缝集成,并提供了高性能和灵活性。然而,在使用 Foreign Function & Memory API 时需要注意安全性和复杂性等问题,以确保程序的稳定性和可靠性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JDK21更新特性详解
String Templates 是 Java 15 中引入的一个新特性,它允许我们在字符串中使用占位符来动态替换变量的值。它提供了一种更简洁、更直观的方式来构建字符串,而不需要使用传统的字符串拼接或格式化方法。
程序员朱永胜
2023/09/23
9600
Java 16 新特性介绍
Java 16 在 2021 年 3 月 16 日正式发布,不是长久支持版本,这次更新没有带来很多语法上的改动,但是也带来了不少新的实用功能。
未读代码
2021/12/13
6340
Java 16 新特性介绍
Java 17 更新(9):Unsafe 不 safe,我们来一套 safe 的 API 访问堆外内存
接下来,我们来聊聊访问外部资源的新 API,这些内容来自于 JEP 412: Foreign Function & Memory API (Incubator)。这个提案主要应对的场景就是调用 Java VM 以外的函数,即 Native 函数;访问 Java VM 以外的内存,即堆外内存(off-heap memory)。
bennyhuo
2021/10/19
2.7K0
Java 17 更新(9):Unsafe 不 safe,我们来一套 safe 的 API 访问堆外内存
生产升级JDK 17 必读手册
因为我们引入了sealed class或interfaces,这些class或者interfaces只允许被指定的类或者interface进行扩展和实现。
鲁大猿
2023/12/29
4750
JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK16特性讲解】
https://openjdk.java.net/projects/jdk/16/
用户4919348
2022/12/25
1.8K0
JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK16特性讲解】
JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK17特性讲解】
  JDK 16 刚发布半年(2021/03/16),JDK 17 又如期而至(2021/09/14),这个时间点特殊,蹭苹果发布会的热度?记得当年 JDK 15 的发布也是同天
用户4919348
2022/12/28
2.9K0
JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK17特性讲解】
Java 19 已至,虚拟线程 = 王炸!!
JDK 19 定于 9 月 20 日正式发布以供生产使用,非长期支持版本。不过,JDK 19 中有一些比较重要的新特性值得关注。
Guide哥
2022/11/07
8380
Java 19 已至,虚拟线程 = 王炸!!
Java JDK 22全新发布 - 猫头虎博主带你一起深入了解JDK22!
近期,Java世界迎来了一位新成员——JDK 22版本,携带着众多引人注目的新特性和改进。从G1垃圾收集器的优化到外部函数和内存API的最终确定,JDK 22为Java开发者带来了更高的性能、更广的平台支持以及更简洁的代码编写体验。Oracle官方提供了六个月的高级支持,让开发者可以充分利用这些新功能。通过本文,我们将深入探讨JDK 22的核心特性,解析它们如何使Java更加强大和灵活。无论你是Java的初学者还是资深大佬,这篇技术博客都会为你揭示JDK 22的潜力和魅力。关键词:JDK 22, Java, G1垃圾收集器, 外部函数与内存API, Oracle高级支持。
猫头虎
2024/04/07
7930
Java JDK 22全新发布 - 猫头虎博主带你一起深入了解JDK22!
JDK20正式发布了GA版本,短期维护支持,以及JDK21预览
最近,Oracle发布了JDK20,相比对于Java开发者来说,JDK的发版是比较收关注的事情了,小简也来和大家一起了解了解JDK20发生了什么变化呢?
JanYork_简昀
2025/05/20
820
JDK20正式发布了GA版本,短期维护支持,以及JDK21预览
巴拿马项目:打通 JVM 与 Native 代码
作者:Denys Makogon 来源:denismakogon.github.io/openjdk/panama/2022/05/31/introduction-to-project-panama-part-1.html 随着 JDK 19 在未来几周*内发布,是时候讨论巴拿马(Panama)项目了,更具体地说,是新的外部函数和内存 API,它简化了 Java 和本机代码之间的互操作性。 编注:2022年9月20日 JDK 19 已正式发布。 本文使用一个简单的基于 Java 的“Hello World”
程序猿DD
2023/04/04
7730
巴拿马项目:打通 JVM 与 Native 代码
过去、现在和未来 —— Java 的现代化之路
本文讲述了Java语言的过去、现在和未来之路。首先介绍了Java从诞生至今一直受到其他语言比较和技术革新的影响,引发公众对其现状以及未来的担忧。然后重点回顾和展望了Java的几个重要更新,如Java 8的Lambda表达式和Stream API,Project Loom的协程支持,Project Panama的本地库访问和堆外内存API,以及Project Valhalla引入值类型对象和补充泛型缺陷。这些更新使Java焕发新生,提高了开发效率,并展示了Java迈向现代化的进步。文章指出,Java在不断演进,未来也将继续前行,为开发者提供更多新功能和优化。
HikariLan贺兰星辰
2024/06/02
2610
JDK 14即将发布,你所要知道的都在这里!
JEP 305: Pattern Matching for instanceof (Preview)
Yano_nankai
2020/01/15
1K0
JDK 14即将发布,你所要知道的都在这里!
Java22的新特性
主要是通过引入Region Pinning来降低使用JNI时G1收集器的延时。与Java代码不同,JNI交互可能使用指向堆中对象的显式指针。当Java线程执行JNI 代码的关键区域时,无法在堆中重新定位这些对象。为了避免此问题,G1在关键区域禁用GC,这可能会导致延迟增加,因为如果其他非JNI线程触发GC,它们将被阻止。此更改允许G1 GC通过固定JNI代码使用的内存区域但允许重新定位和收集其他内存区域,即使线程位于关键区域也可以运行。
code4it
2024/03/27
4030
Java22的新特性
Java22的新特性
主要是通过引入Region Pinning来降低使用JNI时G1收集器的延时。与Java代码不同,JNI交互可能使用指向堆中对象的显式指针。当Java线程执行JNI 代码的关键区域时,无法在堆中重新定位这些对象。为了避免此问题,G1在关键区域禁用GC,这可能会导致延迟增加,因为如果其他非JNI线程触发GC,它们将被阻止。此更改允许G1 GC通过固定JNI代码使用的内存区域但允许重新定位和收集其他内存区域,即使线程位于关键区域也可以运行。
code4it
2024/03/25
1840
Java 17 更新(10):访问外部函数的新 API,JNI 要凉了?
我们书接上回,接着聊 JEP 412: Foreign Function & Memory API (Incubator) 当中访问外部函数的内容。
bennyhuo
2021/10/19
2.5K0
Java 17 更新(10):访问外部函数的新 API,JNI 要凉了?
Java 18 概述:新特性一览
Java 18 是 Java 平台的最新版本,引入了一些令人兴奋的新特性和改进。这些新功能不仅提高了开发者的生产力,还显著增强了 Java 语言的性能和安全性。本文将深入探讨 Java 18 的主要新特性,并结合代码示例,帮助读者更好地理解和应用这些新功能。
程序猿川子
2024/09/09
1810
Java 18 概述:新特性一览
Java 22 正式发布,一文了解全部新特性
就在昨晚,Java 22正式发布!该版本提供了 12 项功能增强,其中包括 7 项预览功能和 1 项孵化器功能。它们涵盖了对 Java 语言、API、性能以及 JDK 中包含的工具的改进。
程序猿DD
2024/03/25
1.4K0
Java 22 正式发布,一文了解全部新特性
Java19的新特性
上面列出的是大方面的特性,除此之外还有一些api的更新及废弃,主要见JDK 19 Release Notes,这里举几个例子。
code4it
2022/09/21
5140
Java19的新特性
Java 22:让Java对AI应用程序/工作负载更具吸引力
甲骨文公司发布了 Java 22,这是流行的编程语言和平台的最新版本,并正在将其用于人工智能用例。
云云众生s
2024/03/28
2700
JDK 20 和 JDK 21 最新动态
作者 | Michael Redlich 译者 | 刘雅梦 策划 | 丁晓昀 JDK 20 是自 JDK 17, 以来的第三个非长期支持(LTS)版本,正如甲骨文 Java 平台组的首席架构师 Mark Reinhold 所宣布的那样,它已经进入了初始候选版本阶段。主线源代码库已于 2022 年 12 月中旬(Rampdown 第一阶段)分支到 JDK 稳定代码库,并定义了 JDK 20 的特性集。严重错误,如回归或严重的功能问题,可能会得到修复,但必须通过修复请求(Fix-Request) 流程
深度学习与Python
2023/03/29
9660
JDK 20 和 JDK 21 最新动态
相关推荐
JDK21更新特性详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验