
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/547380.html
標籤:其他
