日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java实例_图例 | Java混合模式分析之火焰图实例

發布時間:2025/3/19 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java实例_图例 | Java混合模式分析之火焰图实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是小小的第五篇

前言

在進行性能調優的時候,通常會借助性能分析工具,常用的性能分析工具有perf,DTrace,分析系統資源的使用情況,這些情況根據CPU,內存,生成相關的文本數據,這些文本數據不容易直接理解,所以采用火焰圖進行分析。用圖表的形式展示出來。本文將會展示具體實例。

火焰圖

火焰圖有不同的資源和事件類型,包括的主要數據有 CPU,Memory,Off-CPU,Hot/Cold。等等。下文中,所描述的火焰圖指的是CPU的火焰圖。

小方塊 每個小方塊代表一個函數,對應一個棧幀,小方塊的寬度表示該函數在采樣期間出現的頻率,寬度越寬表示出現的頻率越高。

棧幀 用于記錄函數的活動記錄,保存函數局部變量,函數參數等信息。因此想要分析函數調用堆棧關系,這里就需要使用采樣得到棧幀信息。

Y 表示函數的調用棧,體現了stack深度,每個垂直方向的頂端小方塊表示正在使用CPU的棧的深度。

X ?表示采用數據的總量,X表示數據在對調用進行合并之后的結果。根據函數的字母順序進行排列。X不代表使用CPU的長短,只是說明該方法出現的次數,寬度越寬表示該方法出現的次數越多。X可以直接作為CPU的時間長短。

生成火焰圖

采樣數據 -> 使用腳本生成 圖解如下

工具

火焰圖是根據任何包含stack traces 的 profile 數據生成,需要采集stack traces 數據, 列舉如下的工具,采集相關的數據

Linux perf_events Mac DTrace and Instruments windows Xperf.exe

這里采用的是perf,在Linux系統下實驗

安裝

sudo yum install perf

生成數據

sudo perf record -F 99 -a -g -- sleep 30

此時會在當前目錄下生成perf.data文件。

生成火焰圖

sudo perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > out.svg

會自動在當前目錄下查找perf.data文件,然后生成svg文件。

然后會自動生成相對應的火焰圖

Java混合模式火焰圖

安裝 perf

perf --version

安裝perf-map-agent

安裝gcc和gcc-c++

sudo yum install gcc
sudo yum install gcc-c++

安裝cmake

sudo mkdir /home/q/perf-tools
cd /home/q/perf-tools/cmake-2.8.6
sudo ./configure --prefix=/home/q/cmake-2.8.6
sudo make && make install

安裝perf-map-agent

git clone https://github.com/jvm-profiling-tools/perf-map-agent
cd /home/q/perf-tools/perf-map-agent
sudo /home/q/cmake-2.8.6/bin/cmake . && sudo make

配置Java選項

JDK >= Java 8 update 60 build 19
參數 **-XX:+PreserveFramePointer**

檢查Jdk


java -version

檢查JVM


ps wwp `pgrep -n java`|grep PreserveFramePointer --color

設置 -XX:+PreserveFramePointer


-Xms24g -Xmx24g -server -XX:+DisableExplicitGC -Dqunar.logs=$CATALINA_BASE/logs -Dqunar.cache=$CATALINA_BASE/cache -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGC -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=1 -Xloggc:$CATALINA_BASE/logs/gc.log -XX:+PrintSafepointStatistics -XX:ReservedCodeCacheSize=512m -XX:CMSInitiatingOccupancyFraction=50 -XX:+UseCMSInitiatingOccupancyOnly -XX:MaxTenuringThreshold=14 -XX:+PreserveFramePointer

安裝FlameGraph

git clone https://github.com/brendangregg/FlameGraph.git

生成腳本

sudo ./gen-flame-graph.sh $SLEEP_SECONDS $PID

具體腳本內容

#!/bin/bash
SLEEP_SECONDS=$1
PID=$2
PERF_TOOLS_HOME=$(pwd)
GEN_RESULTS_DIR=$PERF_TOOLS_HOME/gen-flame-graphs-result
AGENT_HOME=$PERF_TOOLS_HOME/perf-map-agent
AGENT_JAR=$AGENT_HOME/attach-main.jar
AGENT_OUT=$AGENT_HOME/out
FLAME_GRAPH_PL_HOME=$PERF_TOOLS_HOME/FlameGraph
FLAME_GRAPH_GENERAGED_FILE=$PERF_TOOLS_HOME/flamegraph-mixed-model-`date +%Y%m%d-%H%M%S`.svg
MAP_FILE=/tmp/perf-$PID.map
function check_env(){
if [[ ! -x $JAVA_HOME ]]; then
echo "ERROR: JAVA_HOME not set correctly; edit $0 and fix"
exit
fi
if [[ ! -x $AGENT_HOME ]]; then
echo $AGENT_HOME
echo "ERROR: AGENT_HOME not set correctly; edit $0 and fix."
exit
fi
if [[ ! -x $GEN_RESULTS_DIR ]]; then
echo "ERROR: '$GEN_RESULTS_DIR' not found;Please mkdir a file :'$GEN_RESULTS_DIR'"
exit
fi
}
#generate perf.data with command: perf record
function perf_record(){
echo "Perf record for all processors with sleep 30 seconds."
cmd_perf="sudo perf record -F 99 -a -g -- sleep 30"
eval $cmd_perf
if [[ -e "./perf.data" ]]; then
echo "SUCCESS: perf.data was generated."
else
echo "ERROR: perf.data not generated;edit $0 and fix."
exit
fi
}
#agent mapping pid
function gen_map_file(){
user=$(ps ho user -p $PID)
echo "Agent mapping PID $PID with user $user"
cmd_agent="cd $AGENT_HOME;java -cp attach-main.jar:$JAVA_HOME/lib/tools.jar net.virtualvoid.perf.AttachOnce $PID"
cmd_agent="sudo -u $user sh -c '$cmd_agent'"
eval $cmd_agent
if [[ -e "$MAP_FILE" ]]; then
echo "generate map file"
chown root $MAP_FILE
chmod 666 $MAP_FILE
else
echo "ERROR: $MAP_FILE not created."
exit
fi
}
#generate flame graph
function gen_flame_graph(){
cmd_stack="sudo perf script|$FLAME_GRAPH_PL_HOME/stackcollapse-perf.pl --pid|$FLAME_GRAPH_PL_HOME/flamegraph.pl --color=java --width=800 --minwidth=0.5 -- --hash > $FLAME_GRAPH_GENERAGED_FILE"
eval $cmd_stack
}
check_env
perf_record
gen_map_file
gen_flame_graph
echo "SUCCESS: generate flame graph."

使用腳本

改腳本是對Java進程的8708采樣30s,生成flamegraph-mixed-model-date +%Y%m%d-%H%M%S.svg的Java混合模式火焰圖

sudo ./gen-flame-graph.sh 30 8708

生成的圖片

小明菜市場

推薦閱讀

●?理論 | 教你徹底學會Java序列化和反序列化

●?面試 | 從一個API緩存演化,詳細了解Redis各項功能

●?理論 | 六種延遲隊列的實現方案

●?實戰 | Element UI 父子組件傳值與事件綁定(逆向)

●?實戰 | Element UI 父子組件傳值與事件綁定(正向)

? ? ? ? ? ? ??? ? ? ??

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的java实例_图例 | Java混合模式分析之火焰图实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。