1. 性能分析工具 1.1. 必須有足夠大的堆來處理數據 1.2. 運行性能分析工具時開啟併發GC演算法 1.3. 不合時宜的Full GC暫停會導致緩衝區的數據溢出 1.4. 性能分析的一個缺陷就是在應用程式中引入測試會改變其性能 1.5. 在工作時要“附加”到被分析的應用程式上 1.5.1. 通過 ...
1. 性能分析工具
1.1. 必須有足夠大的堆來處理數據
1.2. 運行性能分析工具時開啟併發GC演算法
1.3. 不合時宜的Full GC暫停會導致緩衝區的數據溢出
1.4. 性能分析的一個缺陷就是在應用程式中引入測試會改變其性能
1.5. 在工作時要“附加”到被分析的應用程式上
-
1.5.1. 通過socket或者被稱為JVM工具介面(JVM Tool Interface,JVMTI)的原生Java介面進行的
-
1.5.2. 目標應用程式和性能分析工具開始交換關於目標應用程式行為的信息
2. 採樣分析器
2.1. 性能分析的基本模式
2.2. 想要減小誤差,就要延長採樣周期並減小採樣間隔
2.3. 安全點偏差(safepoint bias)
- 2.3.1. 只有線上程到安全點之後才可以獲取線程的棧軌跡(stack trace)
2.4. 線程自動進入安全點場景
-
2.4.1. 在同步鎖上阻塞
-
2.4.2. 等待I/O時阻塞
-
2.4.3. 等待管程時阻塞
-
2.4.4. 線程掛起
-
2.4.5. 正在執行Java本地介面(Java Native Interface,JNI)代碼(執行GC鎖定函數除外)
2.5. 非同步分析器(async profiler)
-
2.5.1. JVM可以在任何時間點提供棧信息,而無須等待線程到達(同步)安全點
-
2.5.2. 通過AsyncGetCallTrace介面實現的
-
2.5.3. 非同步介面在Java 8被公開,在此之前它是私有介面
-
2.5.4. 以非同步方式收集棧信息的採樣分析器引入的測量失真更小
2.6. 火焰圖(flame graph)
-
2.6.1. 一個應用程式調用棧的互動式圖表
-
2.6.2. 自底向上的圖表
-
2.6.3. 開源項目async-profiler
2.7. 自頂向下的調用樹(call tree)
3. 探查分析器
3.1. 相對於採樣分析器更有侵入性
- 3.1.1. 會在類載入時更改位元組碼序列
3.2. 能提供更多關於應用程式內部正在發生什麼的有益信息
3.3. 更可能在應用程式中引入性能偏差
- 3.3.1. 編譯器是基於代碼的大小來決定是否內聯的,而根據代碼探查的方式,方法可能不再符合內聯的條件
3.4. 最好用於二級分析
-
3.4.1. 採樣分析器將性能問題指向某個包或某段代碼,然後探查分析器在需要時深入研究此代碼
-
3.4.2. 用於探查一小部分代碼——幾個類或包