內容簡介
《大話Java性能最佳化》主要提供Java性能調優方面的參考建議及經驗交流。作者力求做到知識的綜合傳播,而不是僅僅只針對Java虛擬機調優進行講解,另外力求每一章節都有實際的案例支撐。具體包括:性能最佳化策略、程式編寫及硬體伺服器的基礎知識、Java API最佳化建議、算法類程式的最佳化建議、並行計算最佳化建議、Java程式性能監控及檢測、JVM原理知識、其他相關最佳化知識等。
通讀《大話Java性能最佳化》後,讀者可以深入了解Java性能調優的許多主題及相關的綜合性知識。讀者也可以把《大話Java性能最佳化》作為參考,對於感興趣的主題,直接跳到相應章節尋找答案。
總的來說,性能調優在很大程度上是一門藝術,解決的Java性能問題越多,技藝才會越精湛。我們不僅要關心JVM的持續演進,也要積極地去了解底層的硬體平台和作業系統的進步。
編輯推薦
1、系統介紹系統調優的解決思路和技術實現
2、結合大家最為熟知的12306、電商等案例
3、架構、設計、開發、算法等多層次多角度思路和策略
4、涉及記憶體、IO等各種問題,提供豐富的經驗參考
5、語言通俗易懂,引人入勝
內容提要
《大話Java性能最佳化》主要提供Java性能調優方面的參考建議及經驗交流。作者力求做到知識的綜合傳播,而不是僅僅只針對Java虛擬機調優進行講解,另外力求每一章節都有實際的案例支撐。具體包括:性能最佳化策略、程式編寫及硬體伺服器的基礎知識、Java API最佳化建議、算法類程式的最佳化建議、並行計算最佳化建議、Java程式性能監控及檢測、JVM原理知識、其他相關最佳化知識等。
通讀《大話Java性能最佳化》後,讀者可以深入了解Java性能調優的許多主題及相關的綜合性知識。讀者也可以把《大話Java性能最佳化》作為參考,對於感興趣的主題,直接跳到相應章節尋找答案。
總的來說,性能調優在很大程度上是一門藝術,解決的Java性能問題越多,技藝才會越精湛。我們不僅要關心JVM的持續演進,也要積極地去了解底層的硬體平台和作業系統的進步。
目錄
第1章 性能調優策略概述 1
1.1 為什麼需要調優 1
1.2 性能最佳化的參考因素 5
1.2.1 傳統計算機體系的分歧 5
1.2.2 導致系統瓶頸的計算資源 7
1.2.3 程式性能衡量指標 8
1.2.4 性能最佳化目標 9
1.2.5 性能最佳化策略 10
1.3 性能調優分類方法 11
1.3.1 業務方面 12
1.3.2 基礎技術方面 12
1.3.3 組件方面 17
1.3.4 架構方面 19
1.3.5 層次方面 20
1.4 本章小結 21
第2章 最佳化前的準備知識 22
2.1 伺服器知識 23
2.1.1 記憶體 23
2.1.2 GPU/CPU 44
2.1.3 硬碟 49
2.1.4 網路架構 51
2.2 新興技術 53
第3章 Java API調用最佳化建議 54
3.1 面向對象及基礎類型 55
3.1.1 採用Clone()方式創建對象 55
3.1.2 避免對boolean判斷 55
3.1.3 多用條件操作符 56
3.1.4 靜態方法代替實例方法 56
3.1.5 有條件地使用final關鍵字 58
3.1.6 避免不需要的instanceof操作 58
3.1.7 避免子類中存在父類轉換 59
3.1.8 建議多使用局部變數 60
3.1.9 運算效率最高的方式——位運算 60
3.1.10 用一維數組代替二維數組 62
3.1.11 布爾運算代替位運算 64
3.1.12 提取表達式最佳化 65
3.1.13 不要總是使用取反操作符(!) 66
3.1.14 不要重複初始化變數 66
3.1.15 變數初始化過程思考 66
3.1.16 對象的創建、訪問過程 69
3.1.17 在switch語句中使用字元串 70
3.1.18 數值字面量的改進 73
3.1.19 最佳化變長參數的方法調用 74
3.1.20 針對基本數據類型的最佳化 75
3.1.21 空變數 76
3.2 集合類概念 77
3.2.1 快速刪除List裡面的數據 78
3.2.2 集合內部避免返回null 80
3.2.3 ArrayList、LinkedList比較 82
3.2.4 Vector、HashTable比較 85
3.2.5 HashMap使用經驗 87
3.2.6 EnumSet、EnumMap 91
3.2.7 HashSet使用經驗 92
3.2.8 LinkedHashMap、TreeMap比較 96
3.2.9 集合處理最佳化新方案 99
3.2.10 優先考慮並行計算 107
3.3 字元串概念 108
3.3.1 String對象 108
3.3.2 善用String對象的SubString方法 111
3.3.3 用charat()代替startswith() 113
3.3.4 在字元串相加的時候,使用' '代替" " 114
3.3.5 字元串切割 114
3.3.6 字元串重編碼 117
3.3.7 合併字元串 118
3.3.8 正則表達式不是萬能的 122
3.4 引用類型概念 123
3.4.1 強引用(Strong Reference) 126
3.4.2 軟引用(Soft Reference) 131
3.4.3 弱引用(Weak Reference) 135
3.4.4 引用佇列 141
3.4.5 虛引用(Phantom Reference) 142
3.5 其他相關概念 146
3.5.1 JNI技術提升 146
3.5.2 異常捕獲機制 150
3.5.3 ExceptionUtils類 154
3.5.4 循環技巧 155
3.5.5 替換switch 157
3.5.6 最佳化循環 158
3.5.7 使用arrayCopy() 159
3.5.8 使用Buffer進行I/O操作 161
3.5.9 使用clone()代替new 164
3.5.10 I/O速度 166
3.5.11 Finally方法裡面釋放或者關閉資源占用 167
3.5.12 資源管理機制 167
3.5.13 犧牲CPU時間 169
3.5.14 對象操作 172
3.5.15 正則表達式 172
3.5.16 壓縮檔案處理 174
3.6 本章小結 175
第4章 程式設計最佳化建議 176
4.1 算法最佳化概述 176
4.1.1 常用算法邏輯描述 177
4.1.2 多核算法最佳化原理 186
4.1.3 Java算法最佳化實踐 188
4.2 設計模式 196
4.2.1 設計模式的六大準則 196
4.2.2 單一對象控制 200
4.2.3 並行程式設計模式 202
4.2.4 接口適配 205
4.2.5 訪問方式隔離 219
4.3 I/O及網路相關最佳化 225
4.3.1 I/O操作最佳化 225
4.3.2 Socket編程 231
4.3.3 NIO2.0檔案系統 235
4.4 數據套用最佳化 236
4.4.1 關係型資料庫最佳化 236
4.4.2 向HBase插入大量數據 240
4.4.3 解決海量數據快取 251
4.5 其他最佳化 256
4.5.1 Web系統性能最佳化建議 256
4.5.2 死鎖情況解決方案 259
4.5.3 JavaBeans組件 268
4.6 本章小結 269
第5章 Java並行程式最佳化建議 270
5.1 並行程式最佳化概述 270
5.1.1 資源限制帶來的挑戰 271
5.1.2 進程、執行緒、協程 272
5.1.3 使用多執行緒的原因 281
5.1.4 執行緒不安全範例 282
5.1.5 重排序機制 284
5.1.6 實例變數的數據共享 286
5.1.7 生產者與消費者模式 288
5.1.8 執行緒池的使用 290
5.2 鎖機制對比 296
5.2.1 鎖機制概述 296
5.2.2 Synchronized使用技巧 298
5.2.3 Volatile的使用技巧 303
5.2.4 佇列同步器 304
5.2.5 可重入鎖 307
5.2.6 讀寫鎖 308
5.2.7 偏向鎖和輕量級鎖 309
5.3 增加程式並行性 310
5.3.1 並發計數器 311
5.3.2 減少上下文切換次數 312
5.3.3 針對Thread類的更新 314
5.3.4 Fork/Join框架 314
5.3.5 Executor框架 318
5.4 JDK類庫使用 319
5.4.1 原子值 320
5.4.2 並行容器 324
5.4.3 非阻塞佇列 332
5.4.4 阻塞佇列 338
5.4.5 並發工具類 365
5.5 本章小結 376
第6章 JVM性能測試及監控 377
6.1 監控計算機設備層 378
6.1.1 監控CPU 380
6.1.2 監控記憶體 405
6.1.3 監控磁碟 417
6.1.4 監控網路 423
6.2 監控JVM活動 428
6.2.1 監控垃圾收集目的 429
6.2.2 GC垃圾回收報告分析 430
6.2.3 圖形化工具 431
6.2.4 GC跟蹤示例 437
6.3 本章小結 438
第7章 JVM性能調優建議 439
7.1 JVM相關概念 439
7.1.1 記憶體使用相關概念 440
7.1.2 位元組碼相關知識 443
7.1.3 自動記憶體管理 448
7.2 JVM系統架構 451
7.2.1 JVM的基本架構 451
7.2.2 JVM初始化過程 453
7.2.3 JVM架構模型與執行引擎 456
7.2.4 解釋器與JIT編譯器 456
7.2.5 類載入機制 457
7.2.6 虛擬機 458
7.3 垃圾回收機制相關 459
7.3.1 GC相關概念 459
7.3.2 垃圾回收算法 468
7.3.3 垃圾收集器 476
7.4 實用JVM實驗 490
7.4.1 將新對象預留在年輕代 490
7.4.2 大對象進入年老代 494
7.4.3 設定對象進入年老代的年齡 495
7.4.4 穩定與震盪的堆大小 497
7.4.5 吞吐量優先案例 498
7.4.6 使用大頁案例 499
7.4.7 降低停頓案例 499
7.4.8 設定最大堆記憶體 499
7.4.9 設定最小堆記憶體 500
7.4.10 設定年輕代 503
7.4.11 設定持久代 504
7.4.12 設定執行緒棧 504
7.4.13 堆的比例分配 505
7.4.14 堆分配參數總結 508
7.4.15 垃圾回收器相關參數總結 509
7.4.16 查詢GC命令 515
7.5 本章小結 515
第8章 其他最佳化建議 516
8.1 Java現有機制及未來發展 516
8.1.1 Java體系結構變化歷史 516
8.1.2 Java語言面臨的挑戰 520
8.1.3 Java8的新特性 522
8.1.4 Java語言前景 523
8.1.5 物聯網:Java和你是一對 524
8.1.6 Java模組化發展 525
8.1.7 OpenJDK的發展 527
8.2 系統架構最佳化建議 528
8.2.1 系統架構調優 528
8.2.2 Java項目最佳化方式分享 530
8.2.3 面向服務架構 534
8.2.4 程式隔離技術 538
8.2.5 團隊並行開發準則 544
8.3 與編程無關 546
8.3.1 工程師品格 546
8.3.2 如何成為技術大牛 547
8.3.3 編程方法分享 548
8.4 本章小結
精彩節摘
序
最大的思想紊亂是相信人們想要相信的事情。
——路易斯·巴斯德(Louis Pasteuer)
Michael周是個具有豐富程式經歷的架構師和項目管理者,他從國內作坊式的軟體開發公司起步,經歷了著名的諮詢公司凱捷的歐洲工作洗禮,後來於美國花旗軟體擔任高級軟體技術總監,平時常常思考和總結21世紀以來我國軟體開發者,特別是Java開發工程師的困惑。
我們通常情況下,一開始可以有條不紊地進行軟體需求定義和分析,隨著上線時間的不斷追近,面對客戶的咄咄逼人的需求修改和即刻變更需求上線壓力,程式設計師作為弱勢群體,往往會考慮時間優先原則,很難守住按部就班的開發計畫和開發方式,從而導致出現了軟體質量的大幅度下降。軟體一定存在修改的餘地,但是程式設計師們通常不相信自己的系統存在諸多問題,尤其是感覺自己已經做得相當完美。系統調優在軟體的後續改進和重構中占有很大的地位,能夠彌補前述的不足,本書以通俗的語言和引人入勝的故事,重點講述軟體性能調優的方法論和具體實現路徑,讀者可以根據自己的實際情況進行參照比對,就像進了兵器庫挑選合適自己的順手武器。
程式湊合著上線是一回事,而能夠優美地運行在壓力下往往很不容易。本書對於所有有志於進行軟體高級管理的人員而言,具有非常重要的意義。
海適雲承CEO兼首席架構師 沈英桓(Sam Shen)
前言
7歲那年,當我合上《上下五千年》一套三冊書籍時,我對自己說,我想當個作家。這一晃27年了,等待了27年,我的第一本書《大話Java性能最佳化》即將面世了。我是多么的忐忑、驚喜,就像第一次面對我的女兒“小頑子”,給她取這個小名,希望她頑強到底,因為我相信,你若頑強到底,一切皆有可能。
從15歲擁有自己第一台電腦算起,已經有接近20年的計算機學習時間,加上11年的工作經歷,我對於工作,對於工程師這個職業,有一些自己的感悟。我認為,職業素養非常重要。
1929年,在汪精衛的支持下,余雲岫等人提出了全面廢除中醫、禁止中醫的提案,並很快獲得初審通過。在這樣的局面下,全國各地中醫師多次到南京請願,雖有孫科等人的支持,但反響不大。相持階段,無獨有偶,汪精衛的岳母身患痢疾,西醫師醫治無效,京城四大名醫之一的施今墨先生毅然赴汪府。施今墨憑脈,每言必中,使汪精衛的岳母心服口服,頻頻點頭稱是。處方時施今墨說:“安心服藥,一診可愈,不必複診。”病危至此,一診可愈?眾人皆疑。據此處方僅服數劑,果如施今墨所言。汪精衛不得不服中醫,最終撤回提案。施老先生醫德高尚,死後遺體都捐獻出來供科學研究,絕不是阿諛奉承之人,他赴汪府,完全是因為對中醫生這個職業的尊重,為了讓人知道中醫的深奧。
戒口
佛教五戒之一的不妄語,要求我們不欺騙他人、不在不清楚實際情況的時候胡亂說話,放到職場,也可以加上信息安全的要求。
《越絕書》載文種述九術時說:“故曰九者勿患,戒口勿傳,以取天下不難,況於吳乎?”文種希望勾踐秘而不宣,以免人多口雜,泄露機密。每個人都有自己的崗位、職責,我們要做的是做好自己的事情,不對不屬於自己工作範圍內的事情評價、傳播,不在背後說同事的壞話。作為一名技術人員,如果不能做到戒口、靜心、專心,那我覺得你應該儘早轉行,你不適合,也絕不會成為一名技術大拿。
氣場
一位職業的工作者,他身上有一種稱為氣場的東西存在。人的氣場是看不見的,但這種力量是巨大的,就像萬有引力一樣,我們每個人身上的這種氣場無時無刻不在影響你的人生。這種氣場的行程與你的觀念、信仰、環境、朋友、呼吸、事物、欲望、靜息與睡眠相關。一個人的氣質很好,外表精神、有修養、有道德,這個人的氣場就好,就會吸引好的事,吸引好的運氣。每個人都會遇到各種各樣的苦難,但是我堅信,你若頑強到底,一切皆有可能。
教養
看不見的教養很難。在烏合之眾中誰能保持優雅和教養?在群體無意識中誰能保持清醒和判斷?更難的是那些“慎獨”的教養。日本有一種文化,叫作“不給別人添麻煩”的文化,我們每個人在做事之前都應該考慮是否自己的行為會給別人造成麻煩。教養不是道德規範,也不是小學生行為準則,其實也並不跟文化程度、社會發展、經濟水平掛鈎,它更是一種體諒,體諒別人的不容易,體諒別人的處境和習慣。對於教養,我個人的理解是,謙遜是一種教養,自尊更是。
心態
尼克·胡哲說過,人們經常埋怨什麼也做不來,但如果我們只記掛著想擁有或欠缺的東西,而不去珍惜所擁有的,那根本改變不了問題!真正改變命運的,並不是我們的機遇,而是我們的態度。
一個人的心態很是重要,心量小的人,芝麻大小的事情也能在心裡翻江倒海。心量大的人,即使在危機面前也能鎮靜自若。同樣一件事情,掀起的波瀾大小卻因人而異。有一句話很好,用於技術人員我覺得尤其合適,“想要成為一棵大樹,就不要去和草爭”。
一個人的成就,不得以金錢衡量,而是一生中,你善待過多少人,有多少人懷念你。成功並非單指事業,無論是愛好或職業上的成功都只是成就。成功應該是多元化的,如人的一生包含了很多追求一樣,而非單一指向。然後,無論你多有成就,真正的成功,就是陪伴家人。所有的情感都是需要陪伴的,這些陪伴成為一個個美好的回憶,這些都是整個家庭最寶貴、最重要的財富,這些遠遠超越物質的重要性。在中國,因為價值觀相對比較單一,社會顯得很浮躁、很物質,所以大多以物質的追求為主,越多越好,內心也想過美好的生活。但當你的心完全趨向金錢的時候,很多美好的東西就會自動禁止了,不會出現在生活中。別讓忙碌空白了回憶。
此外,作為一名技術人員,我覺得,職業生涯中可能很多次需要面對工作的變換、角色的變化,有很多知識需要學習,所以,我們應該把“歸零”當成一種生活的新常態。
勸學
我覺得有一句話總結得特別好,“能幹工作、乾好工作是職場生存的基本保障”。
荀子是儒家八派中一派的創始人,其思想學說以儒家為本,兼采道、法、名、墨諸家之長。荀子在他的著作《勸學》一文中這樣寫道,“君子曰:學不可以已。青,取之於藍,而青於藍;冰,水為之,而寒於水。”這段文字大體表達了學習是不可以停止的,君子廣泛學習並且每天反省自己,就會明白道理,行為上也不會有什麼過錯。
全球成功的科技型企業,無論是微軟的比爾·蓋茨,還是蘋果的賈伯斯,Facebook的扎克伯格,無一不是技術專家,創新型企業必須由這樣的企業家帶隊,懂技術,就會站在前沿。對於大型科技企業而言,光懂技術不夠,還要懂市場。
諸葛亮在給他的兒子寫的著名的《誡子書》中指出,寧靜才能夠修養身心,靜思反省。不能夠靜下來,則不可以有效地計畫未來,而且學習的首要條件,就是有寧靜的環境。審慎理財,量入為出,不但可以擺脫負債的困擾,更可以過著簡樸的生活,不會成為物質的奴隸。要計畫人生,不要事事講求名利,才能夠了解自己的志向,要靜下來,才能夠細心計畫將來。學習需要專注,平靜心境才能事半功倍。學習的過程中,決心和毅力非常重要,因為缺乏了意志力,就會半途而廢。拖延就不能夠快速地掌握要點。時光飛逝,意志力也會隨著時間消磨。
歸屬感
每個足球隊有11位球員在球場上比賽,估計最不引人注目的應該是守門員了吧,他要忍受著大多數時間的無聊,還要保持著警惕。當危機發生時,很有可能還要一個人戰鬥,需要勇敢地面對對方前鋒,唯一的目標是,絕對不讓你攻破球門。我們很多時候可能也是如此,苦苦奮鬥,當解決了某個問題,或是幫助公司拿到某個招標,我們都會感到自豪感、成就感,這就是歸屬感,對於技術領域的歸屬感。
最後,自我介紹一下,我叫周明耀,研究生學歷,一名九三學社社員,12年工作經驗,IBM開發者論壇專家作者。我是一名IT技術狂熱愛好者,一名頑強到底的工程師。我推崇技術創新、思維創新,對於新技術非常熱愛。
感謝我的家人,和諧的家庭幫助我完成了這本書,我的妻子,她美麗、細心、博學、偶爾不那么溫柔,但是我很愛她。我的小頑子,她天生的性格很像我,希望她能夠踏踏實實做人,保持創新精神,平平安安、健健康康地生活下去。感謝我妻子父母、我的父母,他們幫我照顧小孩,我才有時間編寫此書。感謝浙江省特級教師、杭州高級化學老師鄭克良老師,鄭老師的一句“永遠不要放棄”,推動著我多年的發展。感謝數學老師張老師在公開場合對我智商的褒獎,第一次收穫這樣的讚賞,對我這樣性格的孩子是多么的重要,謝謝。感謝王芳同學,因為你的插畫天賦,讓這本書的內容更加豐富、可讀,不要忽視了自己的才華,你很有天賦。
我相信這本書不是終點,它是麥克叔叔此生一系列技術書籍的開端,下一本書籍見。