支援JDK19虛擬執行緒的web框架,之三:觀察執行中的虛擬執行緒

2023-09-15 18:00:56

歡迎存取我的GitHub

這裡分類和彙總了欣宸的全部原創(含配套原始碼):https://github.com/zq2599/blog_demos

本篇概覽

  • 本篇是《支援JDK19虛擬執行緒的web框架》系列的第三篇,在前面兩篇咱們一起了解和體驗了支援虛擬執行緒的web服務,功能效能都試過,整個開發過程也完整執行,算是對quarkus和虛擬執行緒有了初步的瞭解,但也留下兩個問題
  1. 虛擬執行緒和常規子執行緒的區別,究竟能不能看出來?前文已經驗證了效能上區別不大,那還有別的方式來觀察和區分嗎?
  2. 能不能稍微深入一點,僅憑一個@RunOnVirtualThread註解就強行寫兩篇部落格,實在是太忽悠人了
  • 本文聚焦第一個問題,與大家一起深入瞭解虛擬執行緒,重點在理論結合實際,將官方資料在實戰中得到印證
  • 至於第二個問題,留待下一篇...

設定

  • 開始深入學習前有個設定需要確認,否則會導致存取服務失敗,請開啟前文開發的quarkus應用,下圖紅色箭頭指向的設定必須存在,且值必須是0.0.0.0

  • 接下來請在自己電腦上安裝JProfiler,注意,這一步必須要做,詳細的安裝和注(po)冊(jie)過程就不寫在本文中了,請自行搜尋相關資料
  • 完成上述準備後,點選下圖箭頭所指按鈕,這樣就指定了JProfiler去監控分析啟動後的應用程序
  • IDEA會拉起JProfiler

  • 下圖是K6的測試報告,可見一共發起了570次請求,然而壓測期間JProfiler上新增的執行緒只有上圖中的十個,這也印證了執行緒池的邏輯:每個執行緒執行完業務邏輯後,回到執行緒池,下一次請求到來時,該執行緒繼續執行業務邏輯

  • 沒錯,官方檔案雖多,但咱們沒必要全看,上面這段才是關鍵,看完後捋捋流程圖如下

  • 再看看那些不再存活的執行緒,如下圖,大量VirtualThreads存在,這也符合虛擬執行緒的特性:不復用,執行完畢就結束

  • 等到壓測結束後,scheduler、carrier、虛擬執行緒,它們都不再存活,如下圖
image-20221022221215621
  • 如此看來,在執行任務的時候,會出現sheduler和carrier來完成虛擬執行緒中的任務,等到這些任務執行完畢,所有真實執行緒、虛擬執行緒都被結束,不再存活
  • 至此,藉助JProfiler觀察常規執行緒和虛擬執行緒的實戰就完成了,經過了這些理論結合實際的操作和分析,相信您對虛擬執行緒的認知已經更具體和全面,如今它不再神祕或者高深莫測,咱們也更有信心學好它用好它

我有個想法

  • 碼字碼到這裡,我想丟擲一個大膽的想法和大家一起討論:今天咱們藉助JProfiler觀察到了scheduler、carrier、虛擬執行緒等的建立、執行、結束等過程,我這裡用的虛擬機器器是azul JDK,所以JProfiler中看到的也只是azul JDK對虛擬執行緒規範的實現情況,如果換成其他JDK,例如Oracle JDK,那麼在JProfiler中看到的scheduler、carrier、虛擬執行緒它們會不會有所不同呢?(例如scheduler可能會存活得久一些)畢竟JEP 425只是個標準,沒有明確規定實現,而azul JDK和Oracle JDK屬於不同廠商的實現
  • 當然了這只是個猜測,篇(lan)幅(de)所(dong)限(shou)就不在本篇做這些事情了,當我相信會有愛動手的讀者去實戰操作的,麻煩您告訴欣宸一下您的驗證結果,謝謝啦!
  • 寫到這裡,虛擬執行緒的文章可以完結了嗎?不會,接下來咱們還要暢遊quarkus,揭祕@RunOnVirtualThread註解背後的故事,看看優秀的框架是如何玩轉虛擬執行緒的,上廣告詞:欣宸原創,不辜負您的期待!

歡迎關注部落格園:程式設計師欣宸

學習路上,你不孤單,欣宸原創一路相伴...