讀Java性能權威指南(第2版)筆記22_ 作業系統工具和Java監控工具
作者:躺着的柒
1. 性能優化是圍繞工具展開的
1.1. 最重要的工具大都是Java開發工具包(JDK)自帶的
1.2. 檢視應用程式性能時,首先應該考察的就是CPU時間
2. 作業系統工具
2.1. Unix系統
- 2.1.1. sar(System Accounting Report)及其組成工具
- 2.1.2. vmstat、iostat和prstat
2.2. Windows系統
- 2.2.1. 有圖形化的資源螢幕
- 2.2.2. 類似typeperf的指令行工具
2.3. CPU使用率
- 2.3.1. 使用者時間
- 2.3.1.1. CPU執行應用程式代碼的時間所占的百分比
- 2.3.2. 系統時間
- 2.3.2.1. 執行核心代碼的時間所占的百分比
- 2.3.2.2. Windows上叫作特權時間
- 2.3.3. CPU空閑原因
- 2.3.3.1. 應用程式阻塞在同步原語上,直到鎖釋放後才能繼續執行
- 2.3.3.2. 應用程式在等待某些東西
- 2.3.3.3. 應用程式沒有事情可做
2.4. 批處理類型應用程式
- 2.4.1. 工作量是固定的
- 2.4.2. CPU空閑意味着無事可做
- 2.4.3. 榨幹CPU的最後一點處理能力是其孜孜以求的目标
2.5. 伺服器處理類型
- 2.5.1. CPU會因為沒有工作可做而處于空閑狀态
2.6. 多CPU的使用率
- 2.6.1. CPU在有工作可做時也可能空閑
- 2.6.2. 以固定大小的線程池運作各種任務
- 2.6.2.1. 線程任務以隊列形式放置,當有線程空閑而且隊列中有任務時,該線程會取出任務并執行
- 2.6.2.2. 不要僅僅因為有空閑的CPU可用,就認為應該增加線程池的大小以完成更多的工作
2.7. 程式無法獲得CPU周期的原因
2.8. CPU運作隊列
- 2.8.1. Unix系統稱之為運作隊列
- 2.8.1.1. vmstat
- 2.8.1.2. 運作隊清單示的是機器上所有的程序資訊
- 2.8.1.3. 讓Unix系統的運作隊列長度小于等于CPU數
- 2.8.2. Windows系統稱之為處理器隊列
- 2.8.2.1. typeperf
- 2.8.2.2. 處理器隊列長度不包含正在運作的線程的數量
- 2.8.2.3. 讓Windows系統的處理器隊列長度等于0
- 2.8.3. 如果運作隊列在相當長的時間内過長,那就說明機器已經過載,需要想辦法減少機器目前的工作量
- 2.8.3.1. 通過将任務移至其他機器或者優化代碼
2.9. 優化代碼的目的是提高CPU使用率(在較短時間内),而不是降低
2.10. 在着手深入優化應用程式之前,應該先弄清楚CPU使用率為什麼低
2.11. 磁盤使用率
- 2.11.1. 對于不直接寫入磁盤的應用程式,系統記憶體交換會影響它們的性能
- 2.11.2. 瓶頸的原因
- 2.11.2.1. 寫入資料的效率不高(吞吐量太低)
- 2.11.2.2. 寫的資料太多(吞吐量太高)
- 2.11.3. iostat
2.12. 網絡使用率
- 2.12.1. netstat
- 2.12.2. typeperf
- 2.12.3. nicstat
- 2.12.4. 對于本地以太網,使用率持續超過40%就說明接口飽和了
- 2.12.5. 瓶頸的原因
- 2.12.5.1. 寫入資料的效率不高(吞吐量太低)
- 2.12.5.2. 寫的資料太多(吞吐量太高)
3. Java監控工具
3.1. jcmd
- 3.1.1. 列印Java程序中的基本類、線程和JVM資訊
- 3.1.2. % jcmd process_id command optional_arguments
3.2. jconsole
- 3.2.1. 提供JVM活動的圖形化視圖
- 3.2.2. 線程的使用
- 3.2.3. 類的使用
- 3.2.4. GC活動
3.3. jmap
- 3.3.1. 提供堆轉儲和其他JVM記憶體使用的資訊
3.4. jinfo
- 3.4.1. 檢視JVM系統屬性
- 3.4.2. 允許動态設定一些系統屬性
3.5. jstack
3.6. jstat
3.7. jvisualvm
- 3.7.1. 監控JVM的GUI工具
- 3.7.2. 可以分析正在運作的應用程式
- 3.7.3. 可以分析JVM堆轉儲檔案
4. 基本的VM資訊
4.1. 運作時間
- 4.1.1. JVM啟動後運作的時長
- 4.1.2. % jcmd process_id VM.uptime
4.2. 系統屬性
- 4.2.1. 顯示了System.getProperties()中的條目
- 4.2.2. % jcmd process_id VM.system_properties
- 4.2.3. % jinfo -sysprops process_id
4.3. JVM版本
- 4.3.1. % jcmd process_id VM.version
4.4. JVM指令行
- 4.4.1. 顯示了指令行直接設定的标志
- 4.4.2. % jcmd process_id VM.command_line
4.5. JVM調優标志
- 4.5.1. 應用程式中生效的調優标志
- 4.5.2. % jcmd process_id VM.flags [-all]
- 4.5.3. 顯示了指令行設定的标志和JVM直接設定的一些标志
- 4.5.4. 加上-all指令可以列出所有的标志
5. 特定JVM平台相關的預設值
5.1. -XX:+PrintFlagsFinal指令
- 5.1.1.
- % java other_options -XX:+PrintFlagsFinal -version uintx InitialHeapSize := 4169431040 {product} intx InlineSmallCode = 2000 {pd product}
- 5.1.2. 輸出中的冒号表示标志使用了非預設值
- 5.1.2.1. 标志的值直接通過指令行設定
- 5.1.2.2. 其他标志間接地改變了這個标志的值
- 5.1.2.3. JVM自動計算出了預設值
- 5.1.3. 沒有冒号,表示目前的值是這個版本JVM的預設值
- 5.1.4. product表示該标志的預設設定在所有平台是統一的
- 5.1.5. pd product表示該标志的預設值依賴于平台
5.2. jinfo
- 5.2.1. 允許在應用程式執行過程中更改标志的值
- 5.2.2. % jinfo -flags process_id