天天看點

讀Java性能權威指南(第2版)筆記22_ 作業系統工具和Java監控工具

作者:躺着的柒
讀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.7.1. 鎖或外部資源的瓶頸

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.11.3.1. Linux

2.12. 網絡使用率

  • 2.12.1. netstat
    • 2.12.1.1. Linux
  • 2.12.2. typeperf
    • 2.12.2.1. windows
  • 2.12.3. nicstat
    • 2.12.3.1. Unix
  • 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.5.1. 轉儲Java程序的棧資訊

3.6. jstat

  • 3.6.1. 提供GC和類加載活動的資訊

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

繼續閱讀