本書的主要特點有:
1. 結構清晰。步步為營,每一章節對應一個單獨的知識點,力求展示虛擬機的全貌。
2. 理論結閤實戰。在每一個理論背後,都給齣瞭演示示例供讀者參考。
3. 專注專業。包括但不限於體係結構、虛擬機的調試方式、常用參數、垃圾迴收係統、Class文件結構、執行係統等,力求從多角度更專業地對Java虛擬機進行探討。
4. 通俗易懂。簡單的白話文風格貫穿全書,盡量做到讀者在閱讀過程中少盲點、無盲點。
5. 技術全麵。縱橫Windows和Linux雙係統下的性能診斷、涉及32位係統和64位係統的優化比較、貫穿從JDK 1.5到JDK 1.8的優化演進。
推薦購買:
隨著越來越多的第三方語言(Groovy、Scala、JRuby等)在Java虛擬機上運行,Java也儼然成為瞭一個充滿活力的生態圈。《實戰Java虛擬機——JVM故障診斷與性能優化》將通過200餘示例詳細介紹Java虛擬機中的各種參數配置、故障排查、性能監控以及性能優化。
《實戰Java虛擬機——JVM故障診斷與性能優化》共11章。第1~3章介紹瞭Java虛擬機的定義、總體架構、常用配置參數。第4~5章介紹瞭垃圾迴收的算法和各種垃圾迴收器。第6章介紹瞭Java虛擬機的性能監控和故障診斷工具。第7章詳細介紹瞭對Java堆的分析方法和案例。第8章介紹瞭Java虛擬機對多綫程,尤其是對鎖的支持。第9~10章介紹瞭Java虛擬機的核心——Class文件結構,以及Java虛擬機中類的裝載係統。第11章介紹瞭Java虛擬機的執行係統和字節碼,並給齣瞭通過ASM框架進行字節碼注入的案例。
《實戰Java虛擬機——JVM故障診斷與性能優化》不僅適閤Java程序員,還適閤任何一名工作於Java虛擬機之上的研發人員、軟件設計師、架構師。
葛一鳴,51CTO特約講師,國傢認證係統分析師,獲得Oracle OCP認證。長期從事Java軟件開發工作,對Java程序設計、JVM有深入的研究,對設計模式、人工智能、神經網絡、數據挖掘等技術有濃厚興趣,著有《自己動手寫神經網路》電子書,也開設瞭在綫的《深入淺齣Java虛擬機——入門篇》培訓課程。
★對Java程序員來說,Java虛擬機(JVM)可以說是既熟悉又神秘,很少有Java程序員能夠抑製自己探究它的衝動。可惜分析JVM故障診斷與性能優化的書籍(尤其是國內齣版的)簡直少之又少。本書的齣版可謂研究JVM的程序員的福音,作者注重理論聯係實際,對於理論性較強的章節和知識點安排瞭大量的實踐案例來說明和進行實際操作,具有非常強的實踐指導意義。同時本書配套操作視頻《深入淺齣Java虛擬機——入門篇》在51CTO學院發布後受到瞭51CTO社區廣大開發者和愛好者的好評和認可,所以,強烈推薦本書給愛好JVM的你!
——51CTO學院高級運營經理 曹亞莉
第1章 初探Java虛擬機 1
1.1 知根知底:追溯Java的發展曆程 2
1.1.1 那些依托Java虛擬機的語言大咖們 2
1.1.2 Java發展史上的裏程碑 2
1.2 跨平颱的真相:Java虛擬機來做中介 4
1.2.1 理解Java虛擬機的原理 4
1.2.2 看清Java虛擬機的種類 5
1.3 一切看我的:Java語言規範 6
1.3.1 詞法的定義 6
1.3.2 語法的定義 7
1.3.3 數據類型的定義 8
1.3.4 Java語言規範總結 9
1.4 一切聽我的:Java虛擬機規範 9
1.5 數字編碼就是計算機世界的水和電 10
1.5.1 整數在Java虛擬機中的錶示 10
1.5.2 浮點數在Java虛擬機中的錶示 12
1.6 拋磚引玉:編譯和調試虛擬機 14
1.7 小結 19
第2章 認識Java虛擬機的基本結構 20
2.1 謀全局者纔能成大器:看穿Java虛擬機的架構 20
2.2 小參數能解決大問題:學會設置Java虛擬機的參數 22
2.3 對象去哪兒:辨清Java堆 23
2.4 函數如何調用:齣入Java棧 25
2.4.1 局部變量錶 27
2.4.2 操作數棧 32
2.4.3 幀數據區 32
2.4.4 棧上分配 33
2.5 類去哪兒瞭:識彆方法區 35
2.6 小結 37
第3章 常用Java虛擬機參數 38
3.1 一切運行都有跡可循:掌握跟蹤調試參數 38
3.1.1 跟蹤垃圾迴收——讀懂虛擬機日誌 39
3.1.2 類加載/卸載的跟蹤 42
3.1.3 係統參數查看 44
3.2 讓性能飛起來:學習堆的配置參數 45
3.2.1 最大堆和初始堆的設置 45
3.2.2 新生代的配置 49
3.2.3 堆溢齣處理 52
3.3 彆讓性能有缺口:瞭解非堆內存的參數配置 54
3.3.1 方法區配置 55
3.3.2 棧配置 55
3.3.3 直接內存配置 55
3.4 Client和Server二選一:虛擬機的工作模式 58
3.5 小結 59
第4章 垃圾迴收概念與算法 60
4.1 內存管理清潔工:認識垃圾迴收 60
4.2 清潔工具大PK:討論常用的垃圾迴收算法 61
4.2.1 引用計數法(Reference Counting) 62
4.2.2 標記清除法(Mark-Sweep) 63
4.2.3 復製算法(Copying) 64
4.2.4 標記壓縮法(Mark-Compact) 66
4.2.5 分代算法(Generational Collecting) 67
4.2.6 分區算法(Region) 68
4.3 誰纔是真正的垃圾:判斷可觸及性 69
4.3.1 對象的復活 69
4.3.2 引用和可觸及性的強度 71
4.3.3 軟引用——可被迴收的引用 72
4.3.4 弱引用——發現即迴收 76
4.3.5 虛引用——對象迴收跟蹤 77
4.4 垃圾迴收時的停頓現象:Stop-The-World案例實戰 79
4.5 小結
255
......
11.6 跑得再快點:靜態編譯優化
當使用javac把Java源碼轉為字節碼時,編譯器會有一些優化以獲得更好的性能。目前,對於執行的字節碼會從兩處進行優化:
第一,就是使用javac編譯時;
第二,就是通過JIT(Just-In-Time)即時編譯,在運行時。
目前,大量的優化工作都圍繞著JIT展開,比如方法內聯、棧上替換等。將優化工作從javac前端移到後端的好處是非常明顯的,這樣,所有基於Java平颱的語言都能共享這種優化帶來的好處。將大量的優化隻放置於javac前端,那麼隻有Java語言可以利用這種優化方式。但即便如此,開發人員也必須要瞭解一些javac的常用優化方法。
11.6.1 編譯時計算
如果在程序中齣現瞭計算錶達式,如果錶達式的值能夠在編譯時確定,那麼錶達式的計算會提前到編譯階段,而不是在運行時計算。
【示例11-30】很多時候,為瞭增強代碼的可讀性,往往不會把最終的數值寫在代碼中,通常傾嚮於把計算過程寫在代碼裏。比如下麵代碼:
for(int i=0;i<60*60*24*1000;i++){
//do sth.
}
循環次數為60*60*24*1000次,通常這個錶達式可能是用來計算天時分秒的乘積。看到這段代碼,可能會讓人産生一種懷疑,是不是這個計算每次循環都要進行一次呢?如果是的話,是不是更應該寫成:
for(int i=0;i< 86400000;i++){
//do sth.
}
或者一定要保留計算錶達式的話:
int count=60*60*24*1000;
for(int i=0;i< count;i++){
//do sth.
}
讀者也許會認為,上述代碼先計算瞭錶達式乘積,並保留這個值,以避免每次循環都重復計算。
實際上,後兩段代碼的擔心是多餘的,因為在編譯的時候,對於給定的錶達式會自動計算並給齣結果。本例中第一段代碼生成的字節碼如下:
#20 = Integer 86400000
0: iconst_0
1: istore_1
2: goto 8
5: iinc 1, 1
8: iload_1
9: ldc #20 // int 86400000
11: if_icmplt 5
14: return
可以看到,用於控製循環次數上限的整數在字節碼中並非經過計算得來,而是保存在常量池中,並直接使用,其作用是用來判定是否可以繼續循環。可見,對於常量錶達式,可以大膽地使用而無需擔心影響係統性能。
【示例11-31】另一個常用的例子是字符串連接。有時候,如果一個字符串很長,通常會傾嚮於使用“+”號連接。由於字符串是不可變的對象,讀者也許會認為使用類似A+B的方式連接字符串時,需要3個對象,即A、B和AB。下麵再來看一個例子。
public static void createString(){
String info1="select * from test";
String info2="select * "+"from test";
String info3="select * ".concat("from test");
System.out.println(info1==info2);
System.out.println(info1==info3);
System.out.println(info2==info3);
System.out.println(info2==info3.intern());
}
上述代碼中,info1是直接定義的字符,info2使用“+”號連接,生成字麵量等於info1的字符串,info3使用String.concat()方法做連接生成。如果執行以上代碼,輸齣如下:
true
false
false
true
可以看到,info1和info2是指嚮瞭同一個對象引用,而info3則是指嚮瞭不同的對象引用,但是info3的常量池引用地址就是info2。這說明info3是被實實在在構造齣來的新的String對象,而info2的“+”號運算並未在運行時進行,否則也應該有新對象産生。查看它的部分字節碼:
0: ldc #24; //String select * from test
2: astore_0
3: ldc #24; //String select * from test
5: astore_1
6: ldc #26; //String select *
8: ldc #28; //String from test
10: invokevirtual #30; //Method java/lang/String.concat:(Ljava/lang/String;) Ljava/lang/String;
13: astore_2
上述字節碼中,第2行錶示將常量池第24項存入第0個局部變量(info1),第5行錶示將常量池第24項存入第1個局部變量(info2)。這裏就解釋瞭為什麼程序會有這樣的輸齣,因為在編譯時,字符串連接已經完成。而對於後續的concat()函數,則沒有這種優化,第10行的invokevirtual調用,就是說明瞭info3是在運行時被創建的。
因此,對於常量字符串連接,不能擔心多寫幾個“+”號就會影響係統性能、多占用內存等,因為這些都會在編譯器進行計算。
……
關於Java生態圈
Java是目前應用最為廣泛的軟件開發平颱之一。隨著Java以及Java社區的不斷壯大,Java也早已不再是簡簡單單的一門計算機語言瞭,它更是一個平颱、一種文化、一個社區。
作為一個平颱,Java虛擬機扮演著舉足輕重的作用。除瞭Java語言,任何一種能夠被編譯成字節碼的計算機語言都屬於Java這個平颱。Groovy、Scala、JRuby等都是Java平颱的一個部分,它們依賴於Java虛擬機,同時,Java平颱也因為它們變得更加豐富多彩。
作為一種文化,Java幾乎成為瞭“開源”的代名詞。在Java程序中,有著數不清的開源軟件和框架,如Tomcat、Struts、Hibernate、Spring等。就連JDK和JVM自身也有不少開源的實現,如OpenJDK、Harmony。可以說,“共享”的精神在Java世界裏體現得淋灕盡緻。
作為一個社區,Java擁有無數的開發人員,有數不清的論壇和資料。從桌麵應用軟件、嵌入式開發到企業級應用、後颱服務器、中間件,都可以看到Java的身影。其應用形式之復雜、參與人數之眾多也令人咋舌。可以說,Java社區已經儼然成為瞭一個良好而龐大的生態係統。
而本書,將主要介紹這個生態係統的核心——Java虛擬機。
本書的體係結構
本書立足於實際開發,又不缺乏理論介紹,力求通俗易懂、循序漸進。本書共分為11章:
第1章主要為綜述,介紹瞭Java虛擬機的概念、定義,講解瞭Java語言規範和Java虛擬機規範,最後,還介紹瞭OpenJDK的調試方法。
第2章介紹瞭Java虛擬機的總體架構,說明瞭堆、棧、方法區等內存空間的作用和彼此之間的聯係。
第3章介紹瞭Java虛擬機的常用配置參數,重點對垃圾迴收跟蹤參數、內存配置參數做瞭詳細的介紹,並給齣瞭案例說明。
第4章從理論層麵介紹瞭垃圾迴收的算法,如引用計數、標記清除、標記壓縮、復製算法等。本章是第5章的理論基礎。
第5章講解瞭基於垃圾迴收的理論知識,進一步詳細介紹瞭Java虛擬機中實際使用的各種垃圾迴收器,包括串行迴收器、並行迴收器、CMS、G1等。
第6章介紹瞭Java虛擬機的性能監控和故障診斷工具,考慮到實用性,也介紹瞭係統級性能監控工具的使用,兩者結閤,可以更好地幫助讀者處理實際問題。
第7章詳細介紹瞭對Java堆的分析方法和案例,主要講解瞭MAT和Visual VM兩款工具的使用,以及各自OQL的編寫方式。
第8章介紹瞭Java虛擬機對多綫程,尤其是對鎖的支持,本章不僅介紹瞭虛擬機內部鎖的實現、優化機製,也給齣瞭一些Java語言層麵的鎖優化思路,最後,還介紹瞭無鎖的並行控製方法。
第9章介紹瞭Java虛擬機的核心——Class文件結構,Class文件作為Java虛擬機的基石,有著舉足輕重的作用,對深入理解Java虛擬機有著不可忽視的作用。
第10章介紹瞭Java虛擬機中類的裝載係統,其中,著重介紹瞭Java虛擬機中ClassLoader的實現以及設計模式。
第11章介紹瞭Java虛擬機的執行係統和字節碼,為瞭幫助讀者更快更好地理解Java字節碼,本章對字節碼進行瞭分類講解,並且理論聯係實際,給齣瞭通過ASM框架進行字節碼注入的案例。
本書特色
本書的主要特點有:
1. 結構清晰。本書采用從整體到局部的視角,首先第1、2章介紹瞭Java虛擬機的整體概況和結構。接著步步為營,每一章節對應一個單獨的知識點,力求展示虛擬機的全貌。
2. 理論結閤實戰。本書不甘心於簡單地枚舉理論知識,在每一個理論背後,都給齣瞭演示示例供讀者參考,幫助讀者更好地消化這些理論。比如,在對Class文件結構和字節碼的介紹中,不僅僅簡單地給齣瞭理論說明,更是使用ASM框架將這些理論應用於實踐,盡可能地做到理論和實踐結閤。
3. 專注專業。本書著眼於Java虛擬機,對Java虛擬機的原理和實踐做瞭豐富的介紹,包括但不限於體係結構、虛擬機的調試方式、常用參數、垃圾迴收係統、Class文件結構、執行係統等,力求從多角度更專業地對Java虛擬機進行探討。
4. 通俗易懂。本書依然服務於廣大虛擬機初學者,盡量避免采用過於理論的描述方式,簡單的白話文風格貫穿全書,盡量做到讀者在閱讀過程中少盲點、無盲點。
5. 技術全麵。縱橫Windows和Linux雙係統下的性能診斷、涉及32位係統和64位係統的優化比較、貫穿從JDK 1.5到JDK 1.8的優化演進。
適閤閱讀人群
雖然本書力求通俗,但要通讀本書並取得良好的學習效果,要求讀者需要具備基本的Java知識或者一定的編程經驗。因此,本書適閤以下讀者:
擁有一定開發經驗的Java平颱開發人員(Java、Scala、JRuby等)
軟件設計師、架構師
係統調優人員
有一定的Java編程基礎並希望進一步理解Java的程序員
虛擬機愛好者,JVM實踐者
本書的約定
本書在敘述過程中,有如下約定:
本書中所述的JDK 1.5、JDK 1.6、JDK 1.7、JDK 1.8等同於JDK 5、JDK 6、JDK 7、JDK 8。
如無特殊說明,Java虛擬機均指HotSpot虛擬機。
如無特殊說明,本書的程序、示例均在JDK 1.7環境中運行。
本書贈送的課程優惠券,可以觀看筆者在51CTO學院的JVM課程。
聯係作者
本書的寫作過程遠比我想象的更艱辛,為瞭讓全書能夠更清楚、更正確地錶達和論述,我經曆瞭好多個不眠之夜,即使現在迴想起來,也忍不住讓我打個寒戰。由於寫作水平的限製,書中難免會有不妥之處,望讀者諒解。
為此,如果讀者有任何疑問或者建議,非常歡迎大傢加入QQ群397196583,一起探討學習中的睏難、分享學習的經驗,我期待與大傢一起交流、共同進步。同時,也希望大傢可以關注我的博客。
感謝
這本書能夠麵世,是因為得到瞭眾人的支持。首先,要感謝我的妻子,她始終不辭辛勞,毫無怨言地對我照顧有加,纔讓我得以騰齣大量時間,並可以安心工作。其次,要感謝小編為我一次又一次地審稿改錯,批評指正,纔能讓本書逐步完善。最後,感謝我的母親30年如一日對我的體貼和關心。
參與本書編寫的還有宋玉紅、關碩、安繼宏、白慧、薛淑英、蔣璽、曹靜、馬玉傑、陳明明、張麗萍、任娜娜、李清藝、荊海霞、趙全利、孫迪,特此感謝!
葛一鳴
這本書的封麵設計就充滿瞭技術感,沉甸甸的紙張質感也讓人覺得內容一定很紮實。我一直對Java虛擬機這個神秘的領域充滿瞭好奇,尤其是在實際開發中,遇到各種各樣的性能瓶頸和內存溢齣問題時,總感覺抓不住問題的根源。這本書的名字就直接點齣瞭核心——“故障診斷與性能優化”,這正是許多Java開發者在職業生涯中都會遇到的痛點。 我特彆關注那些關於JVM調優的章節,想象著書中會詳細講解各種JVM參數的含義,以及如何根據實際情況來調整它們,比如堆內存的分配、垃圾迴收器的選擇和參數配置等等。我希望書中能夠通過真實的案例,一步步地剖析問題,展示如何定位內存泄漏、CPU飆升等棘手問題,並給齣切實可行的解決方案。這一點對於我們日常的開發和運維工作來說,無疑是雪中送炭。
評分不得不說,這本書的書名非常有吸引力。“故障診斷”和“性能優化”是每一個Java開發者在實際工作中都繞不開的兩個關鍵詞。我經常在生産環境中遇到一些難以捉摸的性能問題,比如接口響應緩慢、係統吞吐量下降,甚至突然的宕機。這些問題往往涉及到JVM的深層機製,而我們往往隻能依靠經驗去猜測,效果不盡如人意。 我非常期待書中能夠提供一套係統性的故障排查流程,從日誌分析、綫程 Dump、堆 Dump 等基礎入手,一步步地引導讀者找到問題的根源。特彆希望書中能有關於如何分析GC日誌的詳細講解,因為GC的頻繁觸發或者長時間停頓往往是性能問題的罪魁禍首。同時,我也希望書中能夠分享一些 JVM 性能優化的“獨門秘籍”,例如如何通過代碼層麵和 JVM 配置層麵的結閤,來達到最優的性能錶現。
評分我一直對JVM內部的工作原理感到好奇,特彆是它如何管理內存、執行字節碼,以及如何進行垃圾迴收。這本書的名字“實戰Java虛擬機”立刻吸引瞭我,讓我覺得它可能不僅僅是理論的堆砌,而是能提供一些實際操作的指導。我希望書中能夠深入淺齣地講解JVM的各個組成部分,比如類加載器、內存區域、執行引擎等,並且通過生動的比喻和圖示,讓這些相對抽象的概念變得容易理解。 我特彆關注書中關於性能優化的部分,因為在實際項目中,性能往往是衡量一個應用好壞的重要指標。我希望書中能夠分享一些常見的性能瓶頸分析方法,比如如何通過監控工具來定位問題,以及如何針對性地進行優化,包括但不限於垃圾迴收調優、綫程池配置、內存泄漏排查等。我期待這本書能夠幫助我建立起一套完整的JVM性能優化體係,讓我能夠寫齣更高效、更穩定的Java程序。
評分拿到這本書的時候,我最先翻閱的是關於Java內存模型的部分。一直以來,我對Java的內存管理都隻是停留在“自動垃圾迴收”的模糊概念上,並沒有深入理解對象在內存中的生命周期、各個區域(堆、棧、方法區等)的作用,以及多綫程環境下可能齣現的可見性、原子性問題。這本書的標題中“實戰”二字,讓我對這部分內容充滿瞭期待,希望它能用清晰易懂的語言,結閤豐富的圖示,將這些抽象的概念具象化,讓我們能夠真正理解“為什麼”會齣現某些內存相關的問題,而不僅僅是知道“如何”解決。 我尤其想瞭解JVM如何跟蹤和管理對象的生命周期,垃圾迴收算法的具體實現原理,比如分代迴收、CMS、G1等,以及它們各自的優缺點和適用場景。書中如果能提供一些實用的工具,比如jvisualvm、jmap、jstack等的使用指南,並且教我們如何從這些工具的輸齣中解讀齣關鍵信息,那將是非常有價值的。我希望這本書能夠幫助我建立起一套完整的JVM知識體係,從而在麵對復雜的內存問題時,能夠從容應對。
評分這本書的封麵設計以及書名“實戰Java虛擬機:JVM故障診斷與性能優化”就透露齣一種深入骨髓的技術氣息。在我多年的Java開發經驗中,JVM的某些深層機製,特彆是其在處理高並發場景下的錶現,以及各種“看不見”的性能瓶頸,一直是我試圖深入理解但又常常感到睏惑的地方。這本書的齣現,仿佛是為我指明瞭一盞明燈。 我尤其看重“故障診斷”這幾個字。我們經常會遇到一些難以溯源的OOM(Out Of Memory)錯誤,或者CPU使用率異常飆升的情況,這時候如果沒有一套係統性的排查思路,很容易陷入“大海撈針”的窘境。我希望這本書能夠提供一套嚴謹而實用的故障排查流程,從JVM的日誌分析、綫程Dump解讀,到堆Dump的深度挖掘,能夠循序漸進地教會我如何“望聞問切”,精準定位問題所在。 同時,“性能優化”也正是我一直在追求的目標。從JVM參數的精細調優,到垃圾迴收算法的選擇與配置,再到綫程安全和內存使用效率的提升,我希望能在這本書中找到行之有效的解決方案。我期待它能用大量的實戰案例,將理論知識轉化為可以直接應用於生産環境的技能,幫助我將Java應用程序的性能推嚮一個新的高度。
評分最近搞活動買瞭不少,為學習花點錢絕對值得,點贊京東
評分早就想買瞭。趕上活動,太閤適瞭
評分用券後很劃算,好評好評
評分買瞭很多書、京東618很給力~
評分書實在不咋滴!
評分買來囤貨,有空慢慢看,一直京東
評分看看
評分虛擬機入門 不錯
評分挺好的!!!!!!
本站所有內容均為互聯網搜尋引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度,google,bing,sogou 等
© 2025 book.cndgn.com All Rights Reserved. 新城书站 版權所有