看起來Java 21將對Node JS構成強大的挑戰!Java 21中有兩個巨大的性能增強,它們解決了Java經常被批評的兩個領域:線程和阻塞IO和GC。
Java 21的主要亮點:
l Loom項目和虛擬線程
l ZGC(升級版)
1.虛擬線程
在最長的一段時間里,我們研究了非阻塞IO、異步操作,然后是Promises和async/Await來協調異步操作。因此,我們不得不處理回調,并執行Promises.all()或CompletableFuture.thenComposite()之類的操作來連接幾個異步操作并處理結果。
最近,Reactive框架開始將任務“組合”為功能管道,然后在線程池或執行器上運行它們。反應式函數式編程比“回調地獄”要好得多,因此,我們被迫轉向函數式編程模型,以便以優雅的方式完成非阻塞/異步。
虛擬線程正在終結回調和承諾。Java團隊已經成功地用極為廉價的虛擬線程提供了一種幾乎可以替代線程的方法。因此,即使您執行舊的Thread.sleep(5000),虛擬線程也會分離而不是阻塞。就數量而言,一臺普通筆記本電腦可以處理2000到5000個線程,而同一臺機器可以處理100多萬個虛擬線程。事實上,官方建議避免使用虛擬線程池。建議每個任務都在新的虛擬線程上運行。虛擬線程支持所有功能——睡眠、等待、ThreadLocal、鎖定等。
虛擬線程允許我們只編寫常規的舊迭代和“看似阻塞”的代碼,并讓Java分離/附加真實的線程,使其變得無阻塞和高性能。然而,我們仍然需要等待像Apache Tomcat和Spring這樣的庫/框架實現者將所有內容從本機線程轉移到虛擬線程。一旦框架完成轉換,所有使用這些升級框架的Java微服務/單體都將自動成為非阻塞的。
以我們在應用程序中遇到的一些線程池為例——Apache Tomcat NIO有25 - 50個工作線程。想象一下NIO可以有50,000個虛擬線程。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了。