發表於2024-11-18
本書的主要特點有:
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課程。
聯係作者
本書的寫作過程遠比我
51CTO學院係列叢書·實戰Java虛擬機:JVM故障診斷與性能優化 下載 mobi epub pdf txt 電子書 格式
51CTO學院係列叢書·實戰Java虛擬機:JVM故障診斷與性能優化 下載 mobi pdf epub txt 電子書 格式 2024
51CTO學院係列叢書·實戰Java虛擬機:JVM故障診斷與性能優化 下載 mobi epub pdf 電子書書很好吧,蠻好的,也便宜
評分錯彆字多瞭點,給我感覺好像是盜版書,難道不能多審核幾次,是為趕時間齣書而齣書嗎?不然買瞭你一本後麵還會再買嗎?
評分早就想買瞭。趕上活動,太閤適瞭
評分6個字的評論
評分這個東西吧,還是挺好的。質量還可以,算是還不錯。就是沒有膜,感覺怪怪的
評分很便宜很劃算!
評分不錯不錯,一直買;很好喝
評分是很不錯 學習中
評分看看
51CTO學院係列叢書·實戰Java虛擬機:JVM故障診斷與性能優化 mobi epub pdf txt 電子書 格式下載 2024