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

前言

起初O'Reilly公司讓我寫一本關于Java性能調優的書時,我還不確定是否值得寫。我在想,難道Java性能調優我們做得還不夠嗎?事實上,雖然我日常的基本工作是Java(和其他)應用程序的性能調優,但我寧愿將大多數時間都花在提高應用程序的算法效率以及處理外部系統的性能瓶頸上,而不是直接進行Java自身性能的調優。

但轉念一想,我不禁啞然失笑(像往常一樣)。的確,我的大量時間都花在了端到端的系統性能調優上,有時會發現那些原本可以用O(log N)卻用了O(n2)算法的代碼。不過這也說明,我每天考慮的都是GC調優、JVM編譯器的性能調優,或者是如何使Java EE API的性能發揮到極致。

說這些并不是想要抹殺過去15年里Java和JVM在性能上取得的巨大進步。1990年代晚期,我在Sun公司擔當Java布道師,當時僅有的真正意義上的“基準測試”工具來自Pendragon軟件的CaffeineMark 2.0。由于種種原因,該基準測試工具設計上的不足很快就限制了它的價值;然而在那個年代,我們總喜歡告訴所有人,依據這個基準測試,Java 1.1.8的性能比Java 1.0快八倍。這并非聳人聽聞——Java 1.1.8已經有了真正的即時編譯器,而Java 1.0差不多完全是解釋型的。

之后,Java標準委員會開始制定更嚴謹的基準測試,Java的性能測試開始圍繞這些基準測試展開。最終,JVM的所有領域——垃圾收集、編譯器和API都獲得了長足的進步。這個過程一直延續到今天,而關于性能的一個重要事實是,調優正變得越來越艱難。引入即時編譯器后所獲得的八倍性能提升,只是一個簡單的工程問題,即使編譯器持續改進,我們也無法再次看到如此巨大的改進了。并行化垃圾收集也曾極大地提升過性能,但最近的變化則是漸進式的。

這是典型的應用發展過程(JVM本身也是另外一個應用):在項目初期,很容易找到架構上的改進點(或代碼缺陷),一旦找到就能極大改善性能。而在成熟應用中,要找到這樣的性能改進點則很罕見。

起初我覺得,從很大程度上說,Java性能調優都已經工程化了,但有幾件事情讓我相信我錯了。首先,我每天在特定環境下運行JVM時,都會遇到許多這樣或那樣的問題。新工程師源源不斷地進入Java領域。在特定的領域,JVM的行為仍然相當復雜,因此有份描述它如何運作的指南很有必要。其次,現在的計算環境發生了變化,已經影響到了工程師們所面臨的性能問題。

在過去幾年中,性能關注點有了分歧。一方面,有大量內存堆可運行JVM的大機器現在已經很普遍了。為了應對這樣的變化,JVM也有了新的垃圾收集器(G1)——這項新技術相比傳統的收集器更需要手工調優。同時,云計算又提升了單CPU的小機器的重要性:你可以從Oracle、Amazon或其他公司以非常便宜的價格租用單CPU機器,運行小的應用服務器。(你獲得的并不是真的單CPU機器,而是一臺巨大機器上的一個虛擬OS鏡像,但虛擬OS被限制為使用單個CPU。從Java角度看,它和單CPU的機器相同。)在這些環境中,正確管理小量內存變得非常重要。

Java平臺也在持續演變。Java的每個新版本都會提供新的語言特性和新的API,這些特性和API并不總是為了提高應用性能,也是為了改善開發人員的生產率。語言特性運用得好,應用的運行就會變得輕快,反之則緩慢笨重。另外,平臺的演化也帶來了一些重要的性能課題:毫無疑問,程序間用JSON交換信息要比用高度優化的私有協議更容易。節約開發人員的時間就是巨大的收益——但真正的目的是確保生產率提升的同時,性能也能提升(至少是兩者之間取得平衡)。

讀者對象

本書適合那些渴望深入了解JVM和Java API性能各個方面的性能調優工程師和開發者。

假如你想快速修復性能問題,比如網站周一早上要上線,而現在已經是周日深夜了,那么本書可能不適合你。

如果你是性能分析的新手,正要開始進行Java的性能分析,那么本書會對你有所幫助。我的目的主要是為新工程師提供足夠多的信息和上下文,以便使他們明白如何將基本的性能調優原則運用到Java應用中去。然而,系統分析的范疇非常廣闊,已經有大量的優秀資源(那些原則當然也適用于Java),從這個意義上來說,希望本書也能成為它們的有益補充。

不過從根本上說,想讓Java運行得飛快,就得深入理解JVM(以及Java API)的實際工作原理。有數以百計的Java性能調優參數,而JVM調優并不像瞎貓碰死耗子那樣,調一下再看看是否奏效。與之相反,我的目的是提供更為詳盡的JVM和API工作原理,以期在你理解它們如何工作的原理之后,能理解應用的某些行為為何糟糕。理解了這些之后,排除那些性能低下、令人不快的行為就會變成簡單(至少是比以前更簡單)的任務。

Java性能調優工作還有一個有趣的方面,就是開發人員的背景和性能調優或QA組人員的背景常常有很大差別。我認識一些開發人員,他們可以記住成千上萬個令人費解的很少使用的Java API方法簽名,但他們對-Xmn的含義卻沒有什么概念。我也認識一些測試工程師,他們可以通過設置垃圾收集器的各種標志來榨取最后一滴性能,但他們卻很少有人能用Java寫出像樣的“Hello, World”。

Java性能調優覆蓋這兩個領域:編譯器和垃圾收集器等的調優參數,以及API的最佳實踐。所以,我假定你對如何編寫Java程序有很好的理解。即便你主要的興趣不是在Java編程,我仍然會花一點時間討論編程,包括例子中包含大量數據的示例程序。

然而,如果你的主要興趣是JVM自身的性能調優——意思是不用更改任何代碼而改變JVM的行為,那么本書的大量章節都對你有用。可以隨意跳過代碼部分,而關注你所感興趣的領域。也許你會順便為Java應用如何影響JVM性能提出一些真知灼見,并向開發人員提出更改建議,以便讓你的性能調優測試工作更加如魚得水。

排版約定

本書使用的排版約定如下。

? 楷體

表示新術語。

? 等寬字體(constant width)

表示程序片段,以及正文中出現的變量、函數名、數據庫、數據類型、環境變量、語句和關鍵字等。

? 等寬粗體(constant width bold

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

? 等寬斜體(constant width italic

表示應該由用戶輸入的值或根據上下文確定的值替換的文本。

這個圖標代表提示或建議。

這個圖標代表重要說明。

這個圖標代表警告或提醒。

使用代碼示例

可以在這里下載本書隨附的資料(代碼示例、練習題等):https://github.com/ScottOaks/JavaPerformanceTuning

讓本書助你一臂之力。也許你需要在自己的程序或文檔中用到本書中的代碼。除非大段大段地使用,否則不必與我們聯系取得授權。例如,無需請求許可,就可以用本書中的幾段代碼寫成一個程序。但是銷售或者發布O'Reilly圖書中代碼的光盤則必須事先獲得授權。引用書中的代碼來回答問題也無需授權。將大段的示例代碼整合到你自己的產品文檔中則必須經過許可。

使用我們的代碼時,希望你能標明它的出處,但不強求。出處一般包括書名、作者、出版商和ISBN,例如:Java Performance:The Definitive Guide by Scott Oaks(O'Reilly,2014). Copyright by Scott Oaks, 978-1-449-35845-7。

如果還有關于使用代碼的未盡事宜,可以隨時與我們聯系:permissions@oreilly.com

Safari?Books Online

Safari Books Online(http://www.safaribooksonline.com)是應需而變的數字圖書館。它同時以圖書和視頻的形式出版世界頂級技術和商務作家的專業作品。

Safari Books Online是技術專家、軟件開發人員、Web設計師、商務人士和創意人士開展調研、解決問題、學習和認證培訓的第一手資料。

對于組織團體、政府機構和個人,Safari Books Online提供各種產品組合和靈活的定價策略。用戶可通過一個功能完備的數據庫檢索系統訪問O'Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology以及其他幾十家出版社的上千種圖書、培訓視頻和正式出版之前的書稿。要了解Safari Books Online的更多信息,我們網上見。

聯系我們

請把對本書的評價和問題發給出版社。

美國:

O'Reilly Media, Inc.

1005 Gravenstein Highway North

Sebastopol, CA 95472

中國:

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

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

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

http://oreil.ly/java-performance-tdg

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

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

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

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

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

致謝

感謝在我寫這本書時所有幫助過我的人。從各方面來看,這本書匯集了我過去15年來在Sun公司和Oracle公司的Java性能調優小組中的所學所知。如果將為這本書提出真知灼見的人都列出來的話,會是一份長長的列表。感謝在那段時間與我一同工作的工程師們,特別是在那些年里耐心回答我鋪天蓋地的問題的人們。

我要特別感謝Stanley Guan、Azeem Jiva、Kim LiChong、Deep Singh、Martijn Verburg和Edward Yue Shung Wong,感謝他們撥冗審閱本書的初稿,感謝他們提供的寶貴意見。雖然本書因為他們的建議而完善了許多,但我相信錯誤仍然在所難免。

O'Reilly的工作人員總是那么樂于助人,感謝我的編輯Meg Blanchette,感謝你在整個寫作過程中的鼓勵。最后,衷心感謝我的丈夫James給予我在為書而抓狂的漫漫長夜里的悉心陪伴,以及周末晚餐。

主站蜘蛛池模板: 永嘉县| 乌什县| 大悟县| 金寨县| 利川市| 雷州市| 富平县| 柯坪县| 象州县| 衡山县| 阜新市| 绥棱县| 灯塔市| 陵水| 抚顺县| 玉屏| 长汀县| 汉沽区| 竹山县| 乡宁县| 安乡县| 广灵县| 平邑县| 简阳市| 甘孜县| 沽源县| 东山县| 玉溪市| 文水县| 石家庄市| 开封县| 祁连县| 保定市| 安徽省| 株洲县| 玛多县| 宝兴县| 梁山县| 平湖市| 四川省| 五华县|