1. 性能優化是圍繞工具展開的 1.1. 最重要的工具大都是Java開發工具包(JDK)自帶的 1.2. 查看應用程式性能時,首先應該考察的就是CPU時間 2. 操作系統工具 2.1. Unix系統 2.1.1. sar(System Accounting Report)及其組成工具 2.1.2. ...
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