為什麼對 Java 效能調優最後都像在調 you?
不知道你有沒有發現,優化Java,或者任何其他語言的程式碼效能經常被當做是一種暗黑藝術。
效能分析有種神祕感。畫面類似是這樣的:一個「黑客」經過多年練就的手藝,能夠快速深入瞭解某個系統,並提出神奇的解決方案,10秒內就讓計算機執行變得飛快。
從現實來看,效能分析更像是經驗主義和心理學的一種奇妙組合。 重點在於,一方面是直觀顯示的指標數字,另一方面是使用者和相關開發人員如何看待這些數字。 正是由於這種加入了主觀判斷的屬性,也導致開發人員在面對效能分析時,容易尋求「靈丹妙藥和心法祕籍 」。
關於 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 執行如飛!在這本「山羊書」裡聚焦了「好的效能工程」所涉及的各個方面:
• 整個軟體生命週期內的效能方法論 • 適用於效能的測試理論 • 度量、統計和工具 • 分析技能(包括系統和資料) • 底層的技術與機制
這不是一本程式碼效能技巧手冊,但全部是啟發式的程式碼級優化技術。
本書的原版在亞馬遜上也獲得了眾多 5 星好評,現在中文版終於來跟大家見面了!還有 InfoQ 技術大會主編,臧秀濤、唯品會資深架構師 ,江南白衣(肖樺)的聯袂推薦!更特別的是,你還可以提前紙書上市一個月先睹為快書中的內容,原價164 元的【紙質書】+【電子書】,12月20日前,購買搶讀活動只需要 88 元,還有免單機會!
相關文章
- Java 應用效能調優最強實踐指南!Java
- java效能調優記錄Java
- java效能調優記錄(限流)Java
- Spark 效能調優--資源調優Spark
- 【效能調優】效能測試、分析與調優基礎
- 《java學習三》jvm效能優化-------調優JavaJVM優化
- ElasticSearch效能調優Elasticsearch
- adnroid效能調優
- 效能調優學習之硬體調優
- 效能調優實戰
- Linux之效能調優Linux
- 效能監控調優
- linux調優效能命令Linux
- .Net效能調優-ArrayPool
- .Net效能調優-MemoryPool
- Java 效能調優的 11 個實用技巧Java
- java效能調優記錄(執行緒阻塞)Java執行緒
- PostgreSQL Collation 怎麼調整,為什麼很多專案都選擇 CtypeSQL
- [java]深入剖析Java效能監控調優視訊教程Java
- solr研磨之效能調優Solr
- Kafka 線上效能調優Kafka
- 2. 效能調優概述
- android效能調優詳解Android
- 效能調優命令之jstackJS
- 淺談Nginx效能調優Nginx
- Nginx安全優化與效能調優Nginx優化
- 高效能 Java 計算服務的效能調優實戰Java
- mysql調優---研發可以做什麼MySql
- TiDB 效能分析&效能調優&優化實踐大全TiDB優化
- 軟體效能測試分析與調優實踐之路-Java應用程式的效能分析與調優-手稿節選Java
- 【譯】React 應用效能調優React
- Spark學習——效能調優(一)Spark
- Spark學習——效能調優(二)Spark
- Spark學習——效能調優(三)Spark
- 記一次效能調優
- go效能調優之火焰圖Go
- 深入理解JVM效能調優JVM
- Oracle 效能調優工具:SQL MonitorOracleSQL