官术网_书友最值得收藏!

前言

當O'Reilly第一次找我,讓我寫一本關于Java性能優化的書時,我心存疑慮。我心想:Java性能不是已經沒什么好寫的了嗎?的確,我每天仍然致力于提升Java應用程序(和其他應用程序)的性能,但是我更認為自己大部分時間在優化低效的算法和處理外部系統的瓶頸,而不是解決任何與Java性能優化直接相關的問題。

思考片刻后我確信,我像往常一樣欺騙了自己。端到端的系統性能優化的確耗費了我大量的時間,我時不時也會碰到原本可以用1算法卻用了算法的代碼。然而實際上,我每天仍會考慮垃圾回收(GC)性能與JVM編譯器性能,也會思索如何從Java API中獲得最佳性能。

1從研究算法的角度來說,log的底數并不重要。因此,這里不標注底數。——編者注

這并不是要抹去20多年來Java和JVM在性能方面的巨大進步。20世紀90年代后期,當我在Sun公司擔任Java布道師時,唯一真正可用的“基準測試”工具是Pendragon軟件的CaffeineMark 2.0。由于種種原因,該工具的設計很快就限制了其使用價值。然而在那時,我們很喜歡告訴大家,基于這個基準測試,Java 1.1.8的性能比Java 1.0的性能高8倍。這當然是真的,因為Java 1.1.8有了真正的即時編譯器,而Java 1.0幾乎完全是解釋型的。

之后,標準委員會開始制定更嚴謹的基準測試,Java的性能圍繞這些基準測試開始提升。結果,JVM的各個方面都有了長足的進步,包括垃圾回收器、編譯器和API。這個過程如今當然還在持續,但一個重要的事實是,性能優化變得越來越難。通過引入即時編譯器實現8倍的性能提升,這在工程上很簡單。盡管編譯器還在持續改進,但我們再也無法實現這樣大的提升了。垃圾回收器的并行化也帶來了巨大的性能提升,但是這些最近的改進更多是漸進式的。

這是典型的應用程序發展歷程(JVM本身也是應用程序):在項目初期,很容易找到架構上的改進點(或代碼缺陷),改進后會帶來巨大的性能提升。在成熟的應用程序中,很少能找到這樣的性能改進點。

在很大程度上,我最初擔心的是工程界對于Java性能可能已經沒什么可做的了。不過,有幾件事讓我確信自己錯了。首先,我每天都會遇到關于在特定環境中運行JVM的這樣或那樣的問題。新的工程師源源不斷地進入Java領域,JVM的運行機制在某些方面又比較復雜,因此,對其操作給出指導仍有裨益。其次,計算環境的變化似乎也改變了工程師如今面臨的性能問題。

在過去的幾年里,人們對性能的關注已經分化。一方面,大型機器已經很常見了,其上可運行使用大量堆內存的JVM。JVM已經使用了新的G1垃圾回收器來處理這些內存。作為一種新的技術,G1垃圾回收器比傳統垃圾回收器更需要手動優化。另一方面,云計算已經重新證明了小型單CPU機器的重要性:你可以去Oracle、Amazon或者其他公司租用一臺便宜的單CPU機器,用來運行小型應用程序服務器。(你并不會得到一臺真正的單CPU機器,實際上你得到的是一臺非常大的機器上的虛擬OS鏡像,但是這個虛擬OS被限制只能使用一個CPU。對于Java應用程序來說,這和運行在單CPU機器上是一樣的。)在這些情況下,正確管理少量內存就變得非常重要。

Java平臺也在不斷進化。每個新的Java版本都會提供新的語言特性和新的API,雖然這并不一定能提升應用程序的性能,但能提高開發人員的生產力。善用這些語言特性有助于使緩慢遲鈍的應用程序順暢運行。平臺的進化帶來了一個值得注意的性能關注點:在兩個程序之間用JSON交換信息,毫無疑問比使用高度優化的專有協議更加簡潔和高效。為開發人員節省時間確實可以提升生產力,但是確保在生產力提升的同時性能也提升(至少打平)才是真正的目標。

本書面向希望理解JVM和Java API的各個方面如何影響性能的性能優化工程師和開發人員。

如果你的網站要在周一早晨上線,而你直到周日深夜還在為一個性能問題尋找快速解決方案,那么本書不適合你。

如果你是性能分析新手,剛開始學習分析Java應用程序,那么本書會對你有所幫助。我的目標是提供足夠多的信息和背景,讓新手工程師能夠理解如何將基本的性能優化準則應用到Java應用程序中。然而,系統性能分析是一個廣闊的領域,領域內有許多關于系統分析的優秀資源(這些資源當然適用于Java),從這個意義上說,本書很適合成為這些資源的有益補充。

不過從根本上講,要讓Java應用程序跑得快,需要對JVM和Java API的實際工作方式有深入的理解。Java的調優標志數以百計,對JVM進行優化不應該是盲目地試驗這些標志,看看哪個有效果。相反,我會提供有關JVM和Java API運行的詳盡知識,希望你在理解了這些原理之后,能夠通過觀察應用程序的具體行為來理解其性能欠佳的原因。了解了這些,擺脫不理想的、低效的Java應用程序行為就變得很簡單了,至少比以前簡單。

Java性能優化工作的一個有趣的方面是,開發人員的技術背景往往與性能組或QA組的工程師截然不同。我認識一些開發人員,他們可以記住一些不常用的API方法簽名,那些方法簽名數量龐大又晦澀,但是他們不知道-Xmn標志的含義。我還認識一些測試工程師,他們通過給垃圾回收器設置各種標志來竭力地提升程序性能,卻幾乎無法寫出一個像樣的Hello World程序。

Java性能優化包括兩個方面:一是編譯器和垃圾回收器等的標志優化,二是API的最佳實踐。本書假設你對如何編寫Java應用程序有很好的理解,即使你的興趣點不在Java的編程方面,我也會用相當大的篇幅討論應用程序,包括含有大量數據的示例應用程序。

如果你的主要興趣是JVM本身的性能優化,即不通過修改代碼進行JVM優化,那么本書的大部分內容仍然對你有益。你可以隨意跳過編碼的部分,只專注于你感興趣的內容。在這個過程中,也許你會深入了解Java應用程序如何影響JVM性能,并能給開發人員提出建議,從而使你的性能優化工作變得更輕松。

本書第1版出版之后,Java的發布周期改為6個月,同時定期發布長期支持版本。這意味著第2版英文版出版時,Java的版本是Java 8和Java 11。盡管本書第1版介紹了Java 8,但那時它還相當新。第2版專注于更加成熟的Java 8和Java 11,主要的更新內容涉及G1垃圾回收器和Java飛行記錄器,也涉及Java在容器化環境中運行方式的變化。

本書第2版會講解Java平臺的新特性,包括新的微基準測試工具(jmh)、新的即時編譯器、應用程序類數據共享、新的性能工具,以及Java 11的新特性,比如緊湊字符串和字符串連接的增強。

本書使用如下排版約定。

黑體字

表示新的術語或重點強調的內容。

等寬字體(constant width)

表示程序代碼,以及段落中引用的程序元素,比如變量名、函數名、數據庫、數據類型、環境變量、語句和關鍵字。

等寬粗體(constant width bold

表示應該由用戶輸入的命令或者其他文本。

等寬斜體(constant width italic

表示應該由用戶提供的值或者根據上下文確定的值。

該元素表示要點總結。

補充資料(代碼示例、練習等)可以在以下地址下載:https://github.com/ScottOaks/JavaPerformanceTuning

本書旨在幫助你完成工作。一般來說,你可以在自己的程序或文檔中使用本書提供的示例代碼。除非需要復制大量代碼,否則無須聯系我們獲得許可。比如,使用本書中的幾個代碼片段編寫程序無須獲得許可,銷售或分發O'Reilly圖書的示例光盤則需要獲得許可;引用本書中的示例代碼回答問題無須獲得許可,將本書中的大量示例代碼放到你的產品文檔中則需要獲得許可。

我們很希望但并不強制要求你在引用本書內容時加上引用說明。引用說明通常包括書名、作者、出版社和ISBN,比如“Java Performance by Scott Oaks (O'Reilly). Copyright 2020 Scott Oaks, 978-1-492-05611-9”。

如果你覺得自己對示例代碼的用法超出了上述許可的范圍,歡迎你通過permissions@oreilly.com與我們聯系。

40多年來,O'Reilly Media致力于提供技術和商業培訓、知識和卓越見解,來幫助眾多公司取得成功。

我們擁有獨一無二的專家和創新者組成的龐大網絡,他們通過圖書、文章、會議和我們的在線學習平臺分享他們的知識和經驗。O'Reilly的在線學習平臺讓你能夠按需訪問現場培訓課程、深入的學習路徑、交互式編程環境,以及O'Reilly和200多家其他出版商提供的大量文本資源和視頻資源。有關的更多信息,請訪問https://www.oreilly.com

如有與本書有關的評價或問題,請聯系出版社。美國:

美國:

O'Reilly Media, Inc.

1005 Gravenstein Highway North

Sebastopol, CA 95472

中國:

北京市西城區西直門南大街2號成銘大廈C座807室(100035)

奧萊利技術咨詢(北京)有限公司

O'Reilly的每一本書都有專屬網頁,你可以在那兒找到本書的相關信息,包括勘誤表、示例代碼以及其他信息。

本書的網頁是https://oreil.ly/java-performance-2e

對于本書的評論和技術性問題,請發送電子郵件到errata@oreilly.com.cn

要了解更多O'Reilly圖書、培訓課程和新聞的信息,請訪問以下網站:https://www.oreilly.com

我們在Facebook的地址如下:http://facebook.com/oreilly

請關注我們的Twitter動態:http://twitter.com/oreillymedia

我們的YouTube視頻地址如下:http://www.youtube.com/oreillymedia

在此,我要感謝每一位在編寫本書的過程中幫助過我的人。這本書總結了我過去20多年中,在Sun公司和Oracle公司的性能組和其他工程組工作時所積累的多方面知識。因此,為本書的出版提供過幫助的人相當多。感謝這段時間里與我共事過的所有工程師,特別是過去一年里耐心回答我各種問題的人,謝謝你們!

我要特別感謝Stanley Guan、Azeem Jiva、Kim LiChong、Deep Singh、Martijn Verburg和Edward Yue Shung Wong,感謝他們在審閱初稿時提供的寶貴意見。他們沒能找出書中所有的錯誤,但是我相信書里的內容在他們的努力下得到了極大的改進。Ben Evans、Rod Hilton和Michael Hunger在各個方面提供了幫助,讓本書第2版有了很大改善。我在Oracle Hotspot性能組的同事Eric Caspole、Charlie Hunt和Robert Strout也耐心地幫我解決了第2版中的各種問題。

O'Reilly公司的工作人員一如既往地給了我很大幫助。我很榮幸能與Meg Blanchette編輯合作完成第1版,而Amelia Blevins則對第2版進行了全面而細心的指導。感謝你們在此過程中給予我的鼓勵!最后,我必須感謝我的伴侶James,感謝他容忍我工作到深夜,容忍我在周末吃晚餐時不斷地分心。

掃描下方二維碼,即可獲取電子書相關信息及讀者群通道入口。

主站蜘蛛池模板: 潼关县| 白水县| 和龙市| 泰州市| 岑巩县| 宜兰县| 赣州市| 蕉岭县| 新蔡县| 渭源县| 津南区| 综艺| 安西县| 万州区| 大余县| 峡江县| 历史| 武陟县| 南康市| 安丘市| 新邵县| 龙川县| 临安市| 区。| 焦作市| 阜新| 丹江口市| 佛学| 襄汾县| 炉霍县| 牡丹江市| 朝阳县| 麟游县| 浮梁县| 平遥县| 如东县| 涪陵区| 贵州省| 前郭尔| 牙克石市| 开平市|