gzyueqian
13352868059

Java 21是Java的重要一步:无阻塞IO和ZGC升级

更新时间: 2024-07-11 10:39:25来源: 粤嵌教育浏览量:680

看起来Java 21将对Node JS构成强大的挑战!Java 21中有两个巨大的性能增强,它们解决了Java经常被批评的两个领域:线程和阻塞IOGC

 

Java 21的主要亮点:

l  Loom项目和虚拟线程

ZGC(升级版)

 

1.虚拟线程

在最长的一段时间里,我们研究了非阻塞IO、异步操作,然后是Promisesasync/Await来协调异步操作。因此,我们不得不处理回调,并执行Promises.all()CompletableFuture.thenComposite()之类的操作来连接几个异步操作并处理结果。

 

最近,Reactive框架开始将任务“组合”为功能管道,然后在线程池或执行器上运行它们。反应式函数式编程比“回调地狱”要好得多,因此,我们被迫转向函数式编程模型,以便以优雅的方式完成非阻塞/异步。

 

虚拟线程正在终结回调和承诺。Java团队已经成功地用极为廉价的虚拟线程提供了一种几乎可以替代线程的方法。因此,即使您执行旧的Thread.sleep5000),虚拟线程也会分离而不是阻塞。就数量而言,一台普通笔记本电脑可以处理20005000个线程,而同一台机器可以处理100多万个虚拟线程。事实上,官方建议避免使用虚拟线程池。建议每个任务都在新的虚拟线程上运行。虚拟线程支持所有功能——睡眠、等待、ThreadLocal、锁定等。

 

虚拟线程允许我们只编写常规的旧迭代和“看似阻塞”的代码,并让Java分离/附加真实的线程,使其变得无阻塞和高性能。然而,我们仍然需要等待像Apache TomcatSpring这样的库/框架实现者将所有内容从本机线程转移到虚拟线程。一旦框架完成转换,所有使用这些升级框架的Java微服务/单体都将自动成为非阻塞的。

 

以我们在应用程序中遇到的一些线程池为例——Apache Tomcat NIO25 - 50个工作线程。想象一下NIO可以有50000个虚拟线程。Apache Camel监听器通常有10-20个线程。想象一下Camel可以有1000-2000个虚拟线程。当然,不再有带虚拟线程的线程池了——所以,它们将有无限的1000个线程。这几乎为Java中的“线程饥饿”画上了句号。

 

只要升级到充分利用Java 21的框架/库,我们所有的Java微服务都将变得无阻塞,只需使用现有代码。

 

(注意:一些操作,如同步的也会阻塞虚拟线程。然而,如果我们用支持虚拟线程的替代方法来代替它们,比如Lock.lock(),那么虚拟线程将能够分离并执行其他任务,直到获得锁。为此,库作者需要对代码做一点点修改,在某些情况下,项目代码库也需要修改,以获得虚拟线程的好处。

 

2.ZGC

ZGC现在支持万亿字节大小的Java堆,具有永久的亚毫秒级暂停。没有重要的警告...它可能会多使用5-10%的内存或慢5-10%的分配速度,但不会再有停止世界的GC暂停和堆大小限制。

 

这两项性能改进将共同加强Java在编程语言中的地位。它可能会暂停节点JS的上升优势,并在某种程度上反应式编程。反应式/函数式编程对于代码可读性和管理大量事件驱动的应用程序可能仍然是好的,但是我们不这样做了需要反应式编程不再用Java做非阻塞IO了。

免费预约试听课