1. 程式人生 > >超好用的自帶火焰圖的 Java 效能分析工具 Async-profiler 瞭解一下

超好用的自帶火焰圖的 Java 效能分析工具 Async-profiler 瞭解一下

如果你經常遇到 Java 線上效能問題束手無策,看著線上服務 CPU 飆升一籌莫展,發現記憶體不斷洩露滿臉茫然。別慌,這裡有一款低開銷、自帶火焰圖、讓你大呼好用的 Java 效能分析工具 - async-profiler。

最近 Arthas 效能分析工具上線了火焰圖分析功能,Arthas 使用 async-profiler 生成 CPU/記憶體火焰圖進行效能分析,彌補了之前記憶體分析的不足。在 Arthas 上使用還是比較方便的,使用方式可以看官方文件。這篇文章介紹 async-profiler 相關內容。

Arthas 火焰圖官方文件:https://alibaba.github.io/arthas/profiler.html

如果你想了解更多 Arthas 資訊,可以參考之前文章:Arthas - Java 線上問題定位處理的終極利器

async-profiler 介紹

async-profiler 是一款開源的 Java 效能分析工具,原理是基於 HotSpot 的 API,以微乎其微的效能開銷收集程式執行中的堆疊資訊、記憶體分配等資訊進行分析。

使用 async-profiler 可以做下面幾個方面的分析。

  • CPU cycles
  • Hardware and Software performance counters like cache misses, branch misses, page faults, context switches etc.
  • Allocations in Java Heap
  • Contented lock attempts, including both Java object monitors and ReentrantLocks

我們常用的是 CPU 效能分析和 Heap 記憶體分配分析。在進行 CPU 效能分析時,僅需要非常低的效能開銷就可以進行分析,這也是這個工具的優點之一。

在進行 Heap 分配分析時,async-profiler 工具會收集記憶體分配資訊,而不是去檢測佔用 CPU 的程式碼。async-profiler 不使用侵入性的技術,例如位元組碼檢測工具或者探針檢測等,這也說明 async-profiler 的記憶體分配分析像 CPU 效能分析一樣,不會產生太大的效能開銷,同時也不用寫出龐大的堆疊檔案再去進行進一步處理,。

async-profile 目前支援 Linux 和 macOS 平臺(macOS 下只能分析使用者空間的程式碼)。

  • Linux / x64 / x86 / ARM / AArch64
  • macOS / x64

async-profiler 工具在取樣後可以生成取樣結果的日誌報告,也可以生成 SVG 格式的火焰圖,在之前生成火焰圖要使用 FlameGraph 工具。現在已經不需要了,從 1.2 版本開始,就已經內建了開箱即用的 SVG 檔案生成功能。

其他資訊可以看官方文件:https://github.com/jvm-profiling-tools/async-profiler

async-profiler 安裝

下載 async-profiler 工具可以在官方的 Github 上直接下載編譯好的檔案,如果你就是想體驗手動擋的感覺,也可以克隆專案,手動編譯一下,不得不說這個工具十分的易用,我在手動編譯的過程十分順滑,沒有出現任何問題。

如果你想下載編譯好的,可以到這裡下載。

https://github.com/jvm-profiling-tools/async-profiler/releases

如果想體驗手動擋的感覺,可以克隆整個專案,進項專案編譯。

手動編譯的環境要求。

  • JDK
  • GCC

下面是手動安裝的操作命令。

git clone https://github.com/jvm-profiling-tools/async-profiler
cd async-profiler
make

執行 make 命令編譯後會在專案的目錄下生成一個 build 資料夾,裡面存放著編譯的結果。下面是我手動編譯的過程輸出。

➜  develop git clone https://github.com/jvm-profiling-tools/async-profiler
Cloning into 'async-profiler'...
remote: Enumerating objects: 69, done.
remote: Counting objects: 100% (69/69), done.
remote: Compressing objects: 100% (54/54), done.
remote: Total 1805 (delta 34), reused 32 (delta 15), pack-reused 1736
Receiving objects: 100% (1805/1805), 590.78 KiB | 23.00 KiB/s, done.
Resolving deltas: 100% (1288/1288), done.
➜  develop cd async-profiler
➜  async-profiler git:(master) make
mkdir -p build
g++ -O2 -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -DPROFILER_VERSION=\"1.6\" -I/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/include/darwin -fPIC -shared -o build/libasyncProfiler.so src/*.cpp -ldl -lpthread
gcc -O2 -DJATTACH_VERSION=\"1.5\" -o build/jattach src/jattach/jattach.c
mkdir -p build/classes
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/bin/javac -source 6 -target 6 -d build/classes src/java/one/profiler/AsyncProfiler.java src/java/one/profiler/AsyncProfilerMXBean.java src/java/one/profiler/Counter.java src/java/one/profiler/Events.java
警告: [options] 未與 -source 1.6 一起設定引導類路徑
1 個警告
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/bin/jar cvf build/async-profiler.jar -C build/classes .
已新增清單
正在新增: one/(輸入 = 0) (輸出 = 0)(儲存了 0%)
正在新增: one/profiler/(輸入 = 0) (輸出 = 0)(儲存了 0%)
正在新增: one/profiler/AsyncProfiler.class(輸入 = 1885) (輸出 = 908)(壓縮了 51%)
正在新增: one/profiler/Events.class(輸入 = 405) (輸出 = 286)(壓縮了 29%)
正在新增: one/profiler/Counter.class(輸入 = 845) (輸出 = 473)(壓縮了 44%)
正在新增: one/profiler/AsyncProfilerMXBean.class(輸入 = 631) (輸出 = 344)(壓縮了 45%)
rm -rf build/classes
➜  async-profiler git:(master)

async-profiler 使用

執行專案裡的 profiler.sh 可以看到 async-profiler 的使用幫助文件。

➜  async-profiler git:(master) ./profiler.sh
Usage: ./profiler.sh [action] [options] <pid>
Actions:
  start             start profiling and return immediately
  resume            resume profiling without resetting collected data
  stop              stop profiling
  status            print profiling status
  list              list profiling events supported by the target JVM
  collect           collect profile for the specified period of time
                    and then stop (default action)
Options:
  -e event          profiling event: cpu|alloc|lock|cache-misses etc.
  -d duration       run profiling for <duration> seconds
  -f filename       dump output to <filename>
  -i interval       sampling interval in nanoseconds
  -j jstackdepth    maximum Java stack depth
  -b bufsize        frame buffer size
  -t                profile different threads separately
  -s                simple class names instead of FQN
  -g                print method signatures
  -a                annotate Java method names
  -o fmt            output format: summary|traces|flat|collapsed|svg|tree|jfr
  -v, --version     display version string

  --title string    SVG title
  --width px        SVG width
  --height px       SVG frame height
  --minwidth px     skip frames smaller than px
  --reverse         generate stack-reversed FlameGraph / Call tree

  --all-kernel      only include kernel-mode events
  --all-user        only include user-mode events
  --sync-walk       use synchronous JVMTI stack walker (dangerous!)

<pid> is a numeric process ID of the target JVM
      or 'jps' keyword to find running JVM automatically

Example: ./profiler.sh -d 30 -f profile.svg 3456
         ./profiler.sh start -i 999000 jps
         ./profiler.sh stop -o summary,flat jps

可以看到使用的方式是:Usage: ./profiler.sh [action] [options]

常用的使用的幾個步驟:

  1. 檢視 java 程序的 PID(可以使用 jps )。
  2. 使用 ./profiler.sh start
  3. 使用 ./profiler.sh status
  4. 使用 ./profiler.sh stop

這種方式使用起來多費勁啊,而且最後輸出的是文字結果,看起來更是費勁,為了不那麼費勁,可以使用幫助裡給的取樣後生成 SVG 檔案例子。

./profiler.sh -d 30 -f profile.svg 3456

這個命令的意思是,對 PID 為 3456 的 java 程序取樣 30 秒,然後生成 profile.svg 結果檔案。

預設情況下是分析 CPU 效能,如果要進行其他分析,可以使用 -e 引數。

-e event     profiling event: cpu|alloc|lock|cache-misses etc.

可以看到支援的分析事件有 CPU、Alloc、Lock、Cache-misses 。

async-profiler 案例

上面說完了 async-profiler 工具的作用和使用方式,既然能進行 CPU 效能分析和 Heap 記憶體分配分析,那麼我們就寫幾個不一般的方法分析試試看。看看是不是有像上面介紹的那麼好用。

Java 案例編碼

很簡單的幾個方法,hotmethod 方法寫了幾個常見操作,三個方法中很明顯 hotmethod3 方法裡的生成 UUID 和 replace(需要正則匹配)操作消耗的 CPU 效能會較多。allocate 方法裡因為要不斷的建立長度為 6萬的陣列,消耗的記憶體空間一定是最多的。

import java.util.ArrayList;
import java.util.Random;
import java.util.UUID;

/**
 * <p>
 * 模擬熱點程式碼
 *
 * @Author niujinpeng
 */
public class HotCode {

    private static volatile int value;

    private static Object array;

    public static void main(String[] args) {
        while (true) {
            hotmethod1();
            hotmethod2();
            hotmethod3();
            allocate();
        }
    }

    /**
     * 生成 6萬長度的陣列
     */
    private static void allocate() {
        array = new int[6 * 1000];
        array = new Integer[6 * 1000];
    }

    /**
     * 生成一個UUID
     */
    private static void hotmethod3() {
        ArrayList<String> list = new ArrayList<>();
        UUID uuid = UUID.randomUUID();
        String str = uuid.toString().replace("-", "");
        list.add(str);
    }

    /**
     * 數字累加
     */
    private static void hotmethod2() {
        value++;
    }

    /**
     * 生成一個隨機數
     */
    private static void hotmethod1() {
        Random random = new Random();
        int anInt = random.nextInt();
    }
}

CPU 效能分析

執行上面的程式,然後使用 JPS 命令檢視 PID 資訊。

➜  develop jps
2800 Jps
2449 HotCode
2450 Launcher
805 RemoteMavenServer36
470 NutstoreGUI
699
➜  develop

上面執行的類名是 HotCode,可以看到對應的 PID 是 2449。

使用 ./profiler.sh -d 20 -f 2449.svg 2449 命令對 2449 號程序取樣20秒,然後得到生成的 2449.svg 檔案,然後我們使用瀏覽器開啟這個檔案,可以看到 CPU 的使用火焰圖。

關於火焰圖怎麼看,一言以蔽之:火焰圖裡,橫條越長,代表使用的越多,從下到上是呼叫堆疊資訊。在這個圖裡可以看到 main 方法上面的呼叫中 hotmethod3 方法的 CPU 使用是最多的,點選這個方法。還可能看到更詳細的資訊。

可以看到 replace 方法佔用的 CPU 最多,也是程式中效能問題所在,是需要注意的地方。

Heap 記憶體分析

還是上面執行的程式,程序 PID 還是 2449,這次使用 -e 引數分析記憶體使用情況。

命令:./profiler.sh -d 20 -e alloc -f 2449-alloc.svg 2449

命令的意思是收集程序號是 2449 的程序的記憶體資訊 20 秒,然後輸出為 2449-alloc.svg 檔案。20秒後得到 svg 檔案使用瀏覽器開啟,可以看到記憶體分配情況。

依舊是橫條越長,代表使用的越多,從下到上是呼叫堆疊資訊。從圖裡可以看出來 main 方法呼叫的 allocate 方法使用的記憶體最多,這個方法裡的 Integer 型別陣列佔用的記憶體又最多,為 71%。

文中測試程式碼已經上傳到 Github:https://github.com/niumoo/lab-notes

<完>
個人網站:https://www.codingme.net
如果你喜歡這篇文章,可以關注公眾號,一起成長。
關注公眾號回覆資源可以沒有套路的獲取全網最火的的 Java 核心知識整理&面試核心資料。

相關推薦

火焰Java 效能分析工具 Async-profiler 瞭解一下

如果你經常遇到 Java 線上效能問題束手無策,看著線上服務 CPU 飆升一籌莫展,發現記憶體不斷洩露滿臉茫然。別慌,這裡有一款低開銷、自帶火焰圖、讓你大呼好用的 Java 效能分析工具 - async-profiler。 最近 Arthas 效能分析工具上線了火焰圖分析功能,Arthas 使用 asyn

Linux下火焰進行效能分析

1 火焰圖簡介 很多人感冒發燒的時候, 往往會模仿神農氏嘗百草的路子: 先嚐嘗抗病毒的藥, 再試試抗細菌的藥, 甭管家裡有什麼藥挨個試, 什麼中藥西藥, 瞎貓總會碰上死耗子, 如此做法自然是不可取的, 正確的做法應該是去醫院驗個血, 確診後再對症下藥. 讓我們回

的memcache管理及視覺化監控工具,真方便!

      memcache做為主流的快取資料庫之一,廣泛在各網際網路平臺使用,但是大家使用中都知道memcache目前沒有一個比較好用的視覺化客戶端工具,每次都要輸入命令進行操作,十分不方便。  而另一款主流快取資料庫redis同樣有這個問題,工作效率低下,問題排查也不

JDK記憶體及執行緒分析工具小記

查詢、監控、分析Java應用程式的時候,我們關注的點主要集中在資源利用,比如CPU,記憶體,IO,執行緒等。其中記憶體以及執行緒的分析尤為常見。記憶體,是否有記憶體洩漏,各個區塊記憶體分配是否大小合適。執行緒,數目是否合理,有沒有死鎖,執行狀態如何。 jps -vl jps是JDK提

5款Java效能分析工具的對比

在給客戶的應用程式維護的過程中,我注意到在高負載下的一些效能問題。理論上,增加對應用程式的負載會使效能等比率的下降。然而,我認為效能下降的比率遠遠高於負載的增加。我也發現,效能可以通過改變應用程式的邏輯來提升,甚至達到極限。為了更詳細的瞭解這一點,我們需要做一些

java效能分析工具

轉載自:https://blog.idrsolutions.com/2014/06/java-performance-tuning-tools/ 9 tools to help you with Java Performance Tuning NetBeans Pr

Java Mission Control-Java 效能分析工具

引言 本文為 Java 效能分析工具系列文章第三篇,這裡將介紹如何使用 Java 任務控制器 Java Mission Control 深入分析 Java 應用程式的效能,為程式開發人員在使用 Java 任務控制器的時候提供幫助。第一篇:作業系統工具,第二篇:Java 內建

vue 上拉載入定義元件,

1.建立元件components > zj-roll > index.vue <template> <div> <slot></slot> <div class='bottom' v-if='(!lastP

vue 上拉加載定義組件,

pro total ges text dex left touch lang client 1.創建組件components > zj-roll > index.vue <template> <div> <slot&g

jq從陣列中刪除指定元素(根據定義條件) 的 $.grep() 方法 jQuery.grep()

  轉: jQuery.grep() 什麼是jQuery.grep()?   jQuery.grep()是一個查詢滿足過濾函式的陣列元素的函式。原始陣列不受影響,返回值為陣列。 用法介紹: 寫法: jQuery.grep( array, function(elementOfArr

媒體文章素材蒐集方法

通常在自媒體文章編輯的自媒體人如果輸出效率較低的話,無非就是兩個原因:沒有素材、執行力低。這兩個問題不管是哪一個其實對效率的影響都是非常大的,那今天就詳細和大家說說關於這兩個問題的解決辦法! 一、文章素材的缺乏 關於素材方面我們需要注意的就是平時的積累以及工具的使用,如果平時沒有養成素

Android定義CheckBox CheckGroup

在MaterialDialog 仿Android 5.0原生的AlertDialog樣式的對話方塊一文中以及詳細介紹了單選/多選對話方塊的用法,但是在現實開發中,我們可能需要在Activity上進行單選多選操作,於是就在MaterialDialog庫中進行了再次

ubuntu 和標記圖片工具shutter

shutter 安裝shutter方法: sudo add-apt-repository ppa:shutter/ppasudo apt-get update && su

開源 5 款的資料庫 GUI 你玩轉 MongoDB、Redis、SQL 資料庫

![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200716122604295-223398174.jpg) 作者:HelloGitHub-**小魚乾** 工欲善其事必先利其器,想要玩溜資料庫,不妨去試試本文安利的 5 款開源的資料

zabbix的模板監控mysql

數據庫 mysql 監控 先看一下zabbix自帶的mysql模板監控項:#很少是吧,沒事生產環境一般我們不用,下一篇將介紹生產環境用的另一種mysql監控。配置zabbix自帶的模板監控mysql數據庫:本文出自 “王家東哥” 博客,謝絕轉載!zabbix用自帶的模板監控mysql

ThinkPHP5 支付寶支付擴展庫(簡單,~)

thinkphp5 支付寶支付 alipay 支付寶擴展我的想法是,只需要調用一個靜態方法就可以完成所需要的所有工作,再也不必重復造輪子!ThinkPHP5 支付寶支付擴展庫, 包括手機網站支付、電腦網站支付、支付查詢、退款、退款查詢、對賬單等隨著支付寶官方不斷更新(目前是2017年7月21日),大家可以在G

怎麽選擇CAD看軟件!幾款的CAD看軟件

怎麽將CAD中的線打斷這個大家都會了,那麽,如何將CAD中打斷的線再重新連接起來呢。今天小編教大家如何將dwg文件查看器中的斷線連接起來,一起來看看具體的操作步驟吧。 1.在電腦上下載安裝好迅捷CAD編輯器,軟件安裝簡單快速,可實現對CAD圖紙的快速查看和編輯。安裝完成後用迅捷CAD編輯器打

ThinkPHP5微信支付擴展庫(超級簡單, 超級!)

微信支付 thinkphp5 ThinkPHP5 微信支付擴展庫(2017年9月24日)歡迎到Github查看最新代碼https://github.com/dream2023/ThinkPHP5-wxpay掃碼支付調用\wxpay\NativePay::getPayImage($params)即可小程

的思維導軟件

導圖 技術分享 center 好用 -a align enter 軟件 alt 好用的思維導圖軟件 mindmanage 好用的思維導圖軟件

Win10巧輸入法輕松打出特殊字符

調用 文章 ads 很多 直接 特殊符號 www. 破折號 今天 給電腦輸入信息時,如果要用上鍵盤上沒有的特殊符號,那就為難了。其實,在Win10中,自帶的微軟拼音就能讓你輕松輸入鍵盤上沒有的符號。下面來看看Win10如何輸入特殊符號。 微軟拼音不但中文輸入智能化做得好,而