全面的性能調優
- 編寫更好的算法
- 編寫更少的代碼
- 過早優化 過早考慮優化是所有噩夢的根源。應該編寫清晰、直接、易讀和易理解的代碼。
- 數據庫可能是瓶頸
- 常見的優化 積少成多地改進性能
原則:
1. 藉助性能分析來優化代碼,注重性能分析中最耗時的操作
2. 新代碼比機器配置更可能引入性能問題,機器配置比JVM或操作系統更容易引入性能問題。
3. 爲應用中最常用的操作編寫簡單算法
許多情況下,JVM只佔整體性能的一小部分;需要對java所在的環境進行整體系統調優,數據庫和其他後臺運行系統性能的重要性不亞於JVM。
性能測試方法
性能測試原則:
1. 測試真實應用 : 應該在產品實際使用的環境中進行性能測試
- 微基準測試 : 用來測試微小代碼單元的性能。
1. 必須使用被測的結果
2. 不要包括無關的操作
3. 必須輸入合理的參數- 宏基準測試: 測試應用自身,以及它所用到的外部資源
- 介基準測試: 測量某方面性能的基準測試,但仍然要執行大量代碼。
- 理解批處理流逝時間、吞吐量和響應時間
- 批處理流逝時間: 看它完成任務花了多少時間
- 吞吐量: 基於一段時間內所能完成的工作量; TPS(每秒事務量)、RPS(每秒請求數)、OPS(每秒操作次數)
- 響應時間: 從客戶端發送請求至收到相應之間的流逝時間。
- 用統計方法應對性能的變化: 性能測試的結果會隨時間而變
- 儘早頻繁測試
- 自動化一切
- 測試一切
- 在真實系統上運行
Java性能調優工具箱
操作系統的工具和分析
系統自帶基本監控工具: linux: sarm vmstat, iostat\ prstat window: typeperf
CPU使用率
通常CPU使用率可以分爲兩類:用戶態時間(cpu執行應用代碼所佔時間比)和系統態時間(CPU執行內核代碼所佔時間比)。
調優的目的: 在儘可能短的時間內讓CPU使用率儘可能地高
CPU運行隊列
磁盤使用率:
監控目的: 1 與應用本身有關,如果應用做大量磁盤I/O操作,I/O就會成爲瓶頸。
2 預計應用不會有很高的I/O,有助於監控系統是否在進行內存交換。
網絡使用率
netstat, typeperf
java監控工具
- jcmd 用來打印java進程所涉及的基本類、線程、vm信息
- jconsole jvm活動的圖形化視圖,包括線程的使用、類的使用和GC活動
- jhat 讀取內存堆轉儲
- jmap 提供堆轉儲和其他JVM內存使用的信息
- jinfo jvm的系統屬性
- jstack 轉儲Java進程的棧信息
- jstat 提供GC和類裝載活動的信息
- jvisualvm jvm監視的GUI工具,
-XX:+Printflagsfinal 顯示調優標誌
性能分析工具
GlassFish
NetBeans
jmc
JFR開啓設置: -XX:+UnlockCommercialFeatures -XX:+flightRecorder
JIT編譯器
JIT(即時)編譯器是Java虛擬機的核心
入門調優: 選擇編譯器類型
編譯器類型: -server 和 -client ,-d64(64位編譯器)
java -client -XX:+TieredCompilation .jar 指定必須使用server編譯器
中級調優:
1 調優代碼緩存: 代碼緩存的大小固定,所以一旦填滿,jvm就不能編譯更多代碼。
-XX:ReservedCodeCacheSize=N 設置代碼緩存大小
2 編譯閾值: 代碼執行的頻度
編譯是基於兩種JVM計數器的: 方法調用計數器和方法中的循環回邊計數器。
-XX:CompileThreshold=N 設置閾值; 閾值=回邊計數器+方法調用計數器
3 檢測編譯過程
高級編譯器調優
1 編譯線程
2 A.聯
3 逃逸分析