為什麼對 Java 效能調優最後都像在調 you?

圖靈小雅發表於2020-11-24

enter image description here

不知道你有沒有發現,優化Java,或者任何其他語言的程式碼效能經常被當做是一種暗黑藝術。

效能分析有種神祕感。畫面類似是這樣的:一個「黑客」經過多年練就的手藝,能夠快速深入瞭解某個系統,並提出神奇的解決方案,10秒內就讓計算機執行變得飛快。

enter image description here

從現實來看,效能分析更像是經驗主義和心理學的一種奇妙組合。 重點在於,一方面是直觀顯示的指標數字,另一方面是使用者和相關開發人員如何看待這些數字。 正是由於這種加入了主觀判斷的屬性,也導致開發人員在面對效能分析時,容易尋求「靈丹妙藥和心法祕籍 」。

關於 Java 效能的一些誤解

很多年了,如果用 Google 搜尋“Java 效能調優”,搜尋權重最高、最熱門的文章之一是在 1997 年到 1998 年左右發表的文章。

這個頁面之所以一直在搜尋結果中排在前列,是因為它在釋出後初始排名比較高,帶來了很多訪問,而這些訪問又反過來提升了它的排名。

但這個頁面上提供的建議已經完全過時,不再成立,很多情況下甚至對應用程式會起到反作用。

但是因為這個頁面在搜尋結果中的權重高,展示位置靠前,很多開發人員都有可能受到這些過時建議的影響。

舉個例子,在很早的 Java 版本中,方法分派效能很差。作為權宜之計,有些 Java 開發人員提倡避免編寫小方法,而建議編寫大方法。當然,隨著技術的發展,虛方法分派的效能已經得到極大提升。

另外,藉助 Java 虛擬機器,特別是自動內聯機制,目前大部分呼叫點已經消除了虛方法分派。按照“把所有東西集中到一個方法中”這個建議編寫的程式碼處於很大的劣勢,因為它對JIT編譯器很不友好。

雖然沒有明確的資料能統計出,這種糟糕的建議會給應用程式的效能帶來多少不利影響,但也清楚地說明了,不使用量化和可驗證的方式來優化效能是有害的。這也反映出,對於網際網路上的一些“坊間傳說”, 不可盲目輕信。

「Java 實際上是一門藍領語言」

這句話出自 Java 之父 James Gosling 。也就是說,Java 一直是一種極其實用的語言。它一開始對效能的態度是,只要環境足夠快並且能提升開發效率,就可以犧牲原始效能。所以直到近幾年,隨著 HotSpot 之類的 JVM 的成熟和進步,Java 環境才開始適合於高效能運算應用程式。

這種實用性在 Java 平臺中以多種方式體現出來,但最明顯的一點就是使用了託管子系統。它的理念是,開發者不需要擔心託管環境下的某些功能細節,而代價是放棄對底層的一些控制。

最明顯的例子當然是記憶體管理。JVM 以可插拔垃圾收集子系統的形式提供自動記憶體管理,所以程式設計師不必手動跟蹤記憶體。

但和大多數現代軟體系統一樣,Java/JVM 軟體棧非常複雜。實際上,因為 JVM 具有高度優化和自適應的特性,所以構建在 JVM 上的生產系統有時會表現出非常微妙而且複雜的效能行為。

由於這些複雜的效能行為,JVM 效能調優實際上是技術、方法論、可測的量和工具的綜合。換句話說,效能是一門實驗科學,它通過下面這些方式實現預期結果:

• 定義期望的結果 • 測量現有系統 • 確定要實現需求所需的工作 • 開始某個改進操作 • 重新測試 • 確定目標是否實現

確定應該測量什麼並記錄這些目標非常重要,而它們也是確定專案工具和可交付成果的一部分。

所以,效能分析是建立在定義和實現非功能性需求的基礎之上的。這個過程不能靠猜測和坊間傳說完成。

那到底有沒有什麼普適性調優的技法?

最佳效能調優的方法

技術的問題在於,它總是在革自己的命。隨著 JIT 和垃圾收集技術的改進,優化應用程式效能的路徑也越來越難以捉摸。即使 JVM 可以優化我們的程式碼,並且讓物件幾乎沒什麼成本,但應用程式和使用者的需求也在持續增長。

有些時候,甚至是大部分時候,“好的”編碼模式盛行:小方法會恰當內聯,介面和型別檢查成本變低,JIT 編譯器生成的原生程式碼緊湊又高效。

但是其他時候,考慮到編譯器和 CPU 的限制,我們需要手動調整程式碼,改變抽象和架構。有些時候,物件幾乎是沒什麼成本的,都不用考慮我們會消耗記憶體頻寬和垃圾收集週期。

其他時候,我們要處理 TB 甚至更大規模的資料集,這時候即使是最好的垃圾收集器和記憶體子系統,也要承受很大壓力。 實際上,解決效能問題的答案是你要了解你的工具。

也就是說你不但要了解 Java 語言是如何工作的,還要知道 JVM 類庫、記憶體、編譯器、垃圾收集器和應用程式執行所在的硬體是如何互動的。

所有的效能問題都沒有單一的解決方案,而是有很多解決方案。技巧就是找到那些方案,並把最能滿足要求的拼湊起來。

而現在,你即將擁有一個應對複雜效能的祕密武器,就是下面這本《Java效能優化實踐:JVM調優策略、工具與技巧》。

這是一本可以當做字典翻的Java效能調優策略大全。你可以學習到如何平衡應用程式的設計和可用的資源,如何監控和調優 JVM,如何利用比老舊的類庫和模式更高效的最新 Java 技術,如何讓 Java 執行如飛!在這本「山羊書」裡聚焦了「好的效能工程」所涉及的各個方面:

• 整個軟體生命週期內的效能方法論 • 適用於效能的測試理論 • 度量、統計和工具 • 分析技能(包括系統和資料) • 底層的技術與機制

這不是一本程式碼效能技巧手冊,但全部是啟發式的程式碼級優化技術。

enter image description here

本書的原版在亞馬遜上也獲得了眾多 5 星好評,現在中文版終於來跟大家見面了!還有 InfoQ 技術大會主編,臧秀濤、唯品會資深架構師 ,江南白衣(肖樺)的聯袂推薦!更特別的是,你還可以提前紙書上市一個月先睹為快書中的內容,原價164 元的【紙質書】+【電子書】,12月20日前,購買搶讀活動只需要 88 元,還有免單機會!

相關文章