Java FlameGraph 火焰圖

上周一個偶然的機會聽同事提到了Java FlameGraph,剛實驗了一下,效果非常好。

一、什么是FlameGraph

直接看圖說話。FlameGraph 是 SVG格式,矢量圖,可以隨意擴大縮小,看不清的信息可以放大看。圖中,各種紅橙黃色沒有什么意義,僅僅做區分用;x軸橫條寬度來度量時間指標,表明每個接口實際占用的CPU時間;y軸代表線程棧的層次,從最底下往上表示堆棧的層層調用。通過看圖,可以發現哪個接口占用的CPU時間較多,從而優化;同時,可以發現調用關系。

?

Java火焰圖的作者是Brendan Gregg,他的博客非常有意思,很多關于性能的分析。以下鏈接是對每個類別的火焰圖的詳細說明。

什么是Java Flame Graphs:Java Flame Graphs

On-CPU:CPU Flame Graphs

Off-CPU:Off-CPU Flame Graphs

Memory:Memory Leak (and Growth) Flame Graphs

Hot/Cold:Hot/Cold Flame Graphs

Differential:Differential Flame Graphs

關于火焰圖的PPT(講解得非常詳細):Blazing Performance with Flame Graphs

?

二、如何生成

兩個步驟:1. 需要java profiler生成trace文件? 2. 將trace文件轉換為svg格式的火焰圖文件。

1.?需要java profiler生成trace文件

在使用Profiler對CPU進行采樣時,根據CPU當前執行所處棧位置以及各個函數棧在總的采樣次數所占比例就可以得出各個函數執行時的CPU占用比例。常用的是lightweight-java-profiler。還有其他的選擇,比如honest-profiler,lightweight-java-profiler會從java虛擬機啟動開始采樣,而有時候我們需要在CPU飆高的時候開始,這時候honest-profiler提供的動態啟停功能就有用武之地了。也有使用perf生成火焰圖。(*perf 要研究一下)

下面以lightweight-java-profiler 舉例

(1) 從github下載軟件

(2) 編譯 make all

(3) 生成的程序存放在build-64文件夾下面

(4)(可選)可以更改一些lightweight-java-profiler的一些選項,打開src/globals.h文件。在長時間采樣時,可以適當地減少每秒采樣次數,不然最終生成的文件會很大,分析起來比較麻煩。

// 每秒采樣頻率
static const int kNumInterrupts = 100;
// Maximum number of stack traces線程棧個數
static const int kMaxStackTraces = 3000;
// 采樣棧深度
static const int kMaxFramesToCapture = 128;  

  kNumInterrupts: 每秒鐘抽取樣本的次數;

  kMaxStackTraces: 線程棧的最大數量   

  kMaxFramesToCapture: 線程棧的深度

?

(5)運行Java程序

  java -agentpath:path/to/liblagent.so ......

(6)java程序啟動后會在當前目錄生成一個traces.txt文件,但文件中只有一些說明信息。程序正常結束(不殺掉進程)后,才會寫入具體采樣信息。

?

2.將trace文件轉換為svg格式的火焰圖文件。

(1)從github下載FlameGraph

(2)轉換?

./stackcollapse-ljp.awk < traces.txt | ./flamegraph.pl > traces.svg
(3)瀏覽器中打開traces.svg文件
三、簡單討論一下Java profiler
關于采樣工具的選取,可以看看文章 Evaluating the Accuracy of Java Profilers ,這里面列舉了xprof,hprof,jprofile和yourkit四種采樣器,并通過幾個壓測場景證明了這幾種采樣器的結果是相互矛盾的。總結的原因有兩點:
1. 采樣器采樣點不夠隨機,這幾種采樣器都只有在safe point采樣;
2. 不同的采樣器會注入不同的代碼,從而影響程序優化過程,同時也影響了safe point的分布,進一步造成采樣差異;
honest-profiler號稱是避開了通過SUN/Oracle management agent去采樣堆棧,而是使用自己實現的使用UNIX 操作系統信號和為Oracle Performance Studio 設計的內部API的sampling agent,從而提升了采樣準確率。
還有一篇文章和 Why many profilers have serous problems。
Java profiler 的兩個常見方式:
1.修改代碼,從而實現采樣。問題是:1. 增加開銷;2. 修改了你的代碼,導致java編譯器的優化行為不確定;3. 影響了代碼的層次,層次越深自然也影響 執行效率。
2.通過獲取on-cpu線程的線程棧方式。問題是:獲取系統范圍的線程棧,jvm必須處于safepoint狀態(看文章What is Java safepoint)。只有當線程處于safepoint狀態的時候,別的線程才能去獲取它的線程棧,而這個safepoint是由jvm 控制的,這對于profiler非常不利,有可能一個很熱的代碼塊,jvm不會在該代碼塊中間放置safepoint,導致profiler無法獲得該線程棧,導致錯誤的profiler結果。

幾個商用的profiler工具都存在上述問題。但是,Oracle Solaris studio利用的是jvmti的一個非標準接口AsyncGetCallTrace來實現,不存在上面問題,Jeremy Manson也利用該接口 實現了一個簡單的profiler工具:lightweight-java-profiler。

?

相關知識:
部分內容摘自 http://blog.csdn.net/c395318621/article/details/55224665
部分內容摘自 http://tacy.github.io/blog/2014/07/16/FlameGraph/
部分內容摘自 http://www.javashuo.com/content/p-6579579.html
部分內容摘自 http://colobu.com/2016/08/10/Java-Flame-Graphs/
文章: Evaluating the Accuracy of Java Profilers  
文章:?Why many profilers have serous problems。
文章:?What is Java safepoint

?

?

轉載于:https://www.cnblogs.com/xingzifei/p/7446264.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371385.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371385.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ADB 常用命令

獲取Android設備號 adb shell getprop ro.serialno 獲取系統版本 adb shell getprop ro.build.version.release>4.2.2 獲取系統api版本 adb shell getprop ro.build.version.sdk>17 獲取設備分辨率&#xff08;SDK4.3&#xff09; adb shell wm size獲取設備屏幕密度&am…

哪個Java線程消耗了我的CPU?

當您的Java應用程序占用100&#xff05;的CPU時&#xff0c;您該怎么辦&#xff1f; 事實證明&#xff0c;您可以使用內置的UNIX和JDK工具輕松找到有問題的線程。 不需要探查器或代理。 為了進行測試&#xff0c;我們將使用以下簡單程序&#xff1a; public class Main {publi…

煙草局計算機筆試,2020年廣西南寧煙草局什么時候筆試?

最近廣西煙草局各地市社招通知頻發&#xff0c;南寧煙草局報名截止至今都無任何消息&#xff0c;根據往年的考情&#xff0c;通知近期很大可能會發布&#xff0c;將于6月底完成筆面!你備考好了嗎&#xff1f;今天廣西中公國企小編來給大家說一下南寧煙草局社招的筆試內容及備考…

JAVA Swing 組件演示***

下面是Swing組件的演示&#xff1a; package a_swing;import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.…

Spring 3.1緩存和@CacheEvict

我的上一個博客演示了Spring 3.1的Cacheable批注的應用&#xff0c; Cacheable批注用于標記返回值將存儲在緩存中的方法。 但是&#xff0c; Cacheable只是Spring的Guy為緩存而設計的一對注釋??中的一個&#xff0c;另一個是CacheEvict 。 像Cacheable一樣&#xff0c; Cache…

centos 獲取硬件序列號_如何在 Linux 上查找硬件規格

在 Linux 系統上有許多工具可用于查找硬件規格。-- Sk&#xff08;作者&#xff09;在 Linux 系統上有許多工具可用于查找硬件規格。在這里&#xff0c;我列出了四種最常用的工具&#xff0c;可以獲取 Linux 系統的幾乎所有硬件&#xff08;和軟件&#xff09;細節。好在是這些…

位置服務器管理器,查看 DIMM 位置

鍵入&#xff1a;-> show /System/Memory/DIMMs -t locationTarget | Property | Value-----------------------------------------------------------------------/System/Memory/DIMMs/ | location | CMIOU0/CM/CMP/BOB00/CH0/DIMM (CPU MemoryDIMM_0 | | IO Unit 0 Memor…

Spring –持久層–編寫實體并配置Hibernate

歡迎來到本教程的第二部分。 當您看到本文有多長時間時&#xff0c;請不要驚慌–我向您保證&#xff0c;這主要是簡單的POJO和一些生成的代碼。 在開始之前&#xff0c;我們需要更新我們的Maven依賴項&#xff0c;因為我們現在將使用Hibernate和Spring。 將以下依賴項添加到pom…

無線服務器主機名是,wifi默認服務器主機名

wifi默認服務器主機名 內容精選換一換以CentOS 7操作系統的彈性云服務器為例&#xff1a;登錄Linux彈性云服務器&#xff0c;查看“cloud-init”的配置文件。檢查“/etc/cloud/cloud.cfg”文件中“update_hostname”是否被注釋或者刪除。如果沒有被注釋或者刪除&#xff0c;則需…

pygame里面物體閃爍運動_利用自閃爍發光二極管探究小車在傾斜軌道上的運動規律...

2020年11月23日&#xff0c;周一&#xff0c;24小時安全值班。利用當班中午的時間&#xff0c;微主在創客空間測試了自閃爍發光二極管在勻加速運動中的效果&#xff0c;結果還比較滿意。將小車放置在傾斜的軌道上&#xff0c;將自閃爍發光二極管和紐扣電池構成頻閃光源&#xf…

python網絡爬蟲與信息提取 學習筆記day3

Day3&#xff1a; 只需兩行代碼解析html或xml信息 具體代碼實現:day3_1 注意BeautifulSoup的B和S需要大寫&#xff0c;因為python大小寫敏感 import requests r requests.get("http://python123.io/ws/demo.html") r.text demo r.text from bs4 import Beauti…

番石榴文件:Java文件管理

正如我在這里 &#xff0c; 這里 &#xff0c; 這里和這里所討論的那樣&#xff0c; Groovy和Java SE 7都為Java文件管理提供了改進。 但是&#xff0c;當特定的Java應用程序尚不能使用Java SE 7或Groovy進行文件管理時&#xff0c;仍然可以通過使用Guava的Files類獲得改進的文…

順序查找

順序查找屬于查找中較容易的一個方法&#xff0c;且對數據是否已經排序沒有要求&#xff0c;是很常用的一個查找算法。 但缺點是必須一個一個數字進行比較查找&#xff0c;查找所需步驟可能較多。 順序查找算法的思想是&#xff0c;將目標與待查找數據進行比較&#xff0c;若發…

王者榮耀微信哪個服務器人最少,王者榮耀:微信區王者人數銳減,大神們都去哪了?這些原因很真實...

原標題&#xff1a;王者榮耀&#xff1a;微信區王者人數銳減&#xff0c;大神們都去哪了&#xff1f;這些原因很真實王者榮耀&#xff1a;微信區王者人數銳減&#xff0c;大神們都去哪了&#xff1f;這些原因很真實大家好&#xff01;王者榮耀S16賽季已經開啟一月之余&#xff…

一個div壓在另一個div上面_【CSS小分享】用CSS畫一個新擬態風格鍵盤

什么是新擬態新擬態的英文名稱是“Neumorphism”&#xff0c;也有人稱為“Soft UI”。簡單講&#xff0c;新擬態是一種圖形樣式&#xff0c;其原理是通過模擬真實物體來為界面的UI元素賦予真實感。新擬態風格起源于dribbble&#xff0c;后面陸續被收錄在2020設計趨勢預測里面&a…

JBoss BRMS與JasperReports進行報告

介紹 Jasperreports是一個免費的可下載庫&#xff0c;可用于為Java EE應用程序生成豐富的報告。 本指南還提供了使用Jasper iReport設計器生成報告模板的步驟。 軟件需求 JBoss BRMS 5.3&#xff08;從客戶門戶網站http://access.redhat.com &#xff09; JasperReports 4.6…

java字符串 刪除指定字符的那些事

需求如下&#xff1a; 1.算出2周以前的時間&#xff0c;以正常日期格式返回 2.如果月份和日期前面有0需要去掉返回結果&#xff0c;比如&#xff1a;2017-08-15 就需要顯示2017-8-15。 Calendar calendar Calendar.getInstance();calendar.add(Calendar.DATE, -14);Date date…

Hibernate中Hql查詢

這篇隨筆將會記錄hql的常用的查詢語句&#xff0c;為日后查看提供便利。 在這里通過定義了三個類&#xff0c;Special、Classroom、Student來做測試&#xff0c;Special與Classroom是一對多&#xff0c;Classroom與Student是一對多的關系&#xff0c;這里僅僅貼出這三個bean的屬…

Java代碼質量工具–概述

最近&#xff0c;我有機會在本地IT社區聚會上介紹了該主題。 這是基本演示&#xff1a; Java代碼質量工具 以及更有意義的思維導圖&#xff1a; 但是&#xff0c;我認為我需要更深入地探討這一主題。 這篇博客文章應該像是在此方向上進行進一步調查的起點。 1. CodePro Anal…

利用yum升級Centos6的gcc版本,使其支持C++11

下面的可以在centos6下工作&#xff0c;centos7下有問題。可能是因為centos下的scl我是拷貝的文件&#xff0c;沒有完全驗證centos6下肯定沒問題。 https://my.oschina.net/u/583362/blog/682123 和https://www.quyu.net/info/876.html 拷貝其關鍵內容就是&#xff1a; 1.使用 …