使用JDK16支援的Loom虛擬執行緒的代價 – Webtide

banq發表於2021-01-03

在本系列部落格中,我們將研究OpenJDK 16早期訪問版本中現在可用的Loom虛擬執行緒新功能。詳細點選標題見原文,直接上結論:
Loom確實允許您有許多執行緒,甚至1,000,000個執行緒,但如果這些執行緒具有深堆疊,則不允許這樣做。這似乎增加了堆疊條目的總記憶體使用量,並且還付出了長時間垃圾回收的代價。這些是對虛擬執行緒的重大限制,因此它們不是銀彈,不是可以替代核心執行緒的解決方案。
Project Loom旨在極大地減少編寫、維護和觀察可充分利用可用硬體的高吞吐量併發應用程式的工作量。…問題在於,執行緒(即併發的軟體單元)無法匹配應用程式域的自然併發單元(會話,HTTP請求或單個資料庫操作)的規模。
Project Loom可以在JVM中新增廉價且快速的生成/阻塞虛擬執行緒,這是很好的。但是便宜的執行緒卻會做昂貴的事情!
擁有1,000,000個併發應用程式實體將佔用記憶體,CPU和其他資源,無論它們阻塞還是使用非同步回撥。正如Loom Structured Concurrency所建議的那樣,Loom可能需要完全不同的程式設計風格,但是我們還沒有看到任何對資源的限制,這些資源會限制虛擬執行緒的無限生成。也有跡象表明,Loom的靈活堆疊管理帶來了CPU成本。
Loom有許多主張:阻​​塞程式碼更容易編寫,虛擬執行緒的啟動速度非常快且阻塞成本低。但是,這些關鍵主張要麼沒有成立,要麼沒有得到證實:我們不認為虛擬執行緒能夠自然擴充套件,因為執行緒本身不是限制因素,而是由資源決定擴充套件。除非採取其他實質性的資源管理策略,否則如果建議人們“忘記執行緒池,只是產生一個新執行緒……”就是誘導人們建立一個不穩定應用程式。

 

相關文章