Java的虚拟线程如何帮助您的业务?

使用 JDK 21,您可以选择使用虚拟线程来提高可扩展性,但最好将其与提供性能改进的 JVM 结合使用。

译自 How Do Java's Virtual Threads Help Your Business?,作者 Simon Ritter。

Java 平台已有近 30 年的历史,但它始终保持在 前三名最流行的编程语言 中。造成这种情况的关键原因之一是 Java 虚拟机 (JVM)。通过抽象掉内存管理和在运行时编译代码等问题,JVM 可以提供超出其他运行时范围的互联网级可扩展性。

让 Java 如此流行的另一个原因是语言、库和 JVM 的演化速度。2019 年, OpenJDK(Java 开发的开源项目)从基于功能的发布计划切换到基于时间的发布计划。现在,我们每年都有两个新版本的 Java,而不是必须等待两到四年。

由于发布如此之多,因此对于发行版来说,为所有版本提供扩展维护和支持是不切实际的。只有被归类为长期支持 (LTS) 的特定版本才包含此支持,从发布之日起标准为八年。(JDK 8 受支持至 2030 年 12 月,JDK 11 受支持至 2032 年 1 月,而 JDK 6 和 7 仅受 Azul 支持至 2027 年 12 月)。所有版本都适合在生产中使用,但大多数企业用户只会选择使用 LTS JDK 部署应用程序。

Java 中的线程如何工作

当前的 LTS 版本是 JDK 22,于 2024 年 3 月发布。JDK 21,于 2023 年 9 月发布,包含了一些有趣的新功能,这些功能将使其对支持大量同时用户的应用程序具有吸引力。

从一开始, Java 是一种支持并发执行任务的语言。与依赖外部库来提供此支持的 C 和 C++ 等语言不同,Java 在语言中内置了线程的概念。

假设您正在开发一个将支持许多同时用户的基于 Web 的应用程序。在这种情况下,可以通过分配他们自己的线程或线程来处理必要的交易,从而并发处理每个用户的连接。所有这些都是独立完成的,使每个用户的数据与其他用户的数据隔离。这称为按请求线程 (TPR) 编程模型。

虽然这对于此类应用程序的开发人员来说非常棒,但它确实有一些限制。例如,Linux 是一个非常流行的操作系统 (OS),它可以处理线程的所有低级方面,并将它们分配给正在使用的硬件的可用 CPU 和内核。在 JDK 21 之前,所有 Java 线程都直接映射到 OS 线程,因此 JVM 无需处理低级方面。

缺点是在处理数十万(或更多)个同时连接时可扩展性。使用如此多的线程时的内存要求使得在本地或云中配置具有成本效益的服务器硬件变得不切实际。

如果您查看大多数 TPR 应用程序的工作方式,您会发现大部分处理涉及对系统其他部分的调用,无论是数据库、文件还是与其他服务的网络连接。这些连接需要线程等待(或阻塞),直到例如数据库做出响应。现实情况是,线程大部分时间都在等待,因此它没有主动使用已分配给它的 OS 线程。

引入虚拟线程以提高可扩展性

JDK 21 引入了虚拟线程功能。与其在 Java 和 OS 线程之间使用一对一映射,我们现在可以拥有多对一映射。多个 Java 线程共享一个 OS 线程。

对于开发人员来说,迁移到虚拟线程非常简单,只需要更改线程的创建方式,而不是使用方式。当应用程序运行时,JVM 负责在共享 OS(现在称为平台)线程的虚拟线程之间切换。

当 Java 线程发出将阻塞它的调用时,JVM 将记录线程的所有详细信息 状态并切换平台线程到具有要执行的工作的不同 Java 线程。默认情况下,虚拟线程的内存要求比平台线程少大约一千倍,因此无需添加硬件即可大幅提高可扩展性。

在考虑虚拟线程时,了解可扩展性和性能之间的差异至关重要。例如,电子商务应用程序的可扩展性决定了同时可以访问它的用户数量。该应用程序的性能决定了系统对每个请求的响应速度。

虚拟线程可能会增加应用程序的可扩展性,允许同时处理更多连接。它不会做的是提高性能以更快地将结果传递给这些连接。

还应注意应用程序如何处理每个连接。如果该连接需要 CPU 密集型任务,而不是大部分时间都在等待的任务,那么很容易导致可扩展性变差,并且连接超时,因为它们无法访问共享平台线程。

提高 Java 性能的解决方案

为了为您的应用程序提供更好的可扩展性和性能,您应该考虑使用经过性能优化的 JVM。通过替换某些内部组件,如内存管理、垃圾回收和即时编译,可以降低延迟并提高吞吐量。Azul 的 Zing JVM 提供了 C4 垃圾回收器、Falcon JIT 编译器和 ReadyNow 预热消除技术。

根据 Gartner 的说法,您有 可供选择的选项。 确保您选择完全符合 Java SE 规范并通过所有必需的技术兼容性工具包 (TCK) 的 JVM。Azul 提供了一个选项,无需您重写或甚至重新编译任何代码。

使用 JDK 21,您可以选择如何利用虚拟线程来提高可扩展性,但最好将其与为您的 Java 应用程序提供性能改进的 JVM 结合使用。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注