1. 程式人生 > >常用Java profiling工具的分析與比較

常用Java profiling工具的分析與比較

在 Java 程式的開發過程中,不可避免地會遇到記憶體使用、效能瓶頸等問題。Java Profiler 工具能幫助開發人員快速、有效地定位這些問題,因此成為了 Java 開發過程中的一個重要工具。目前市場上的 Java Profiler 工具種類繁多,本文將對目前比較常見的幾種工具進行簡要介紹,並從功能、效能等角度作比較,從而幫助 Java 程式設計師選擇合適的 Java Profiler 工具。

本文主要分為三個部分:第一部分簡要介紹 Java Profiler 工具的原理;第二部分對目前常見的 Java Profiler 工具 TPTP, CodePro Profiler, YourKit Java Profiler, JProfiler 進行簡要介紹;第三部分對以上工具從不同的角度進行比較,幫助開發人員選擇合適的工具。

相對於靜態程式碼分析,Profiling 是通過收集程式執行時的資訊來研究程式行為的動態分析方法。其目的在於定位程式需要被優化的部分,從而提高程式的執行速度或是記憶體使用效率。收集程式執行時資訊的方法主要有以下三種:

  • 事件方法:對於 Java,可以採用 JVMTI(JVM Tools Interface)API 來捕捉諸如方法呼叫、類載入、類解除安裝、進入 / 離開執行緒等事件,然後基於這些事件進行程式行為的分析。 
  • 統計抽樣方法(sampling): 該方法每隔一段時間呼叫系統中斷,然後收集當前的呼叫棧(call stack)資訊,記錄呼叫棧中出現的函式及這些函式的呼叫結構,基於這些資訊得到函式的呼叫關係圖及每個函式的 CPU 使用資訊。由於呼叫棧的資訊是每隔一段時間來獲取的,因此不是非常精確的,但由於該方法對目標程式的干涉比較少,目標程式的執行速度幾乎不受影響。 
  • 植入附加指令方法(BCI): 該方法在目標程式中插入指令程式碼,這些指令程式碼將記錄 profiling 所需的資訊,包括執行時間、計數器的值等,從而給出一個較為精確的記憶體使用情況、函式呼叫關係及函式的 CPU 使用資訊。該方法對程式執行速度會有一定的影響,因此給出的程式執行時間有可能不準確。但是該方法在統計程式的執行軌跡方面有一定的優勢。 

目前市面上的 Java Profiler 工具採用的資訊收集方法通常是以上三種方法的任意組合。

雖然市場上的 Java Profiler 工具有不少,但是基本功能大多相似,本節首先對這些基本功能進行介紹。

  • 遙測(Telemetry):遙測是一種用來檢視應用程式執行行為的最簡單的方法。通常會有多個檢視(View)分別實時地顯示 CPU 使用情況、記憶體使用情況、執行緒狀態以及其他一些有用的資訊,以便使用者能很快地發現問題的關鍵所在。 
    • CPU Telemetry 檢視一般用於顯示整個應用程式的 CPU 使用情況,有些工具還能顯示應用程式中每個執行緒的 CPU 使用情況。 
    • Memory Telemetry 檢視一般用於顯示堆記憶體和非堆記憶體的分配和使用情況。 
    • Garbage Collection Telemetry 檢視顯示了 JVM 中垃圾收集器的詳細資訊。 
    • Threads Telemetry 檢視一般用於顯示當前執行執行緒的個數、守護程序的個數等資訊。 
    • Classes Telemetry 檢視一般用於顯示已經載入和還沒有載入的類的數量。 
  • 快照(snapshot):應用程式啟動後,profiler 工具開始收集各種執行資料,其中一些資料直接顯示在遙測檢視中,而另外大部分資料被儲存在內部,直到使用者要求獲取快照,基於這些儲存的資料的統計資訊才被 顯示出來。快照包含了應用程式在一段時間內的執行資訊,通常有兩種型別的快照:CPU 快照和記憶體快照。 
    • CPU 快照:主要包含了應用程式中函式的呼叫關係及執行時間,這些資訊通常可以在 CPU 快照檢視中進行檢視。 
    • 記憶體快照:主要包含了記憶體的分配和使用情況、載入的所有類、存在的物件資訊及物件間的引用關係。這些資訊通常可以在記憶體快照檢視中進行檢視。 
  • CPU Profiling:CPU Profiling 的主要目的是統計函式的呼叫情況及執行時間,或者更簡單的情況就是統計應用程式的 CPU 使用情況。通常有兩種方式來顯示 CPU Profiling 結果:CPU 遙測和 CPU 快照。 
  • 記憶體 Profiling:記憶體 Profiling 的主要目的是通過統計記憶體使用情況檢測可能存在的記憶體洩露問題及確定優化記憶體使用的方向。通常有兩種方式來顯示記憶體 Profiling 結果:記憶體遙測和記憶體快照 
  • 執行緒 Profiling:執行緒 Profiling 主要用於在多執行緒應用程式中確定記憶體的問題所在。 一般包括三個方面的資訊: 
    • 某個執行緒的狀態變化情況 
    • 死鎖情況 
    • 某個執行緒線上程生命期內狀態的分佈情況 
  • Profiling 的啟動設定:類似於 eclipse 中 Run 和 Debug 的啟動設定,進行 Profiling 之前也需要進行啟動設定,包括:profiling 的模式 (CPU profiling 或記憶體 profiling),資訊獲取型別(遙測 , 抽樣統計或者 BCI ) 等等。 
  • Profiler Preference 設定:主要用於 Profiler 過濾器(選擇需要關注的包、類)、取樣間隔時間的設定等。 

本文接下來將對目前市場上常見的幾種 Java Profiler 工具進行介紹。

TPTP

TPTP(Test and Performance Tools Platform)是 eclipse 官方的 Profiling 工具外掛。TPTP 提供了諸如測試,追蹤(trace),效能測試,圖形介面效能分析等功能。同時 TPTP 還是一個可擴充套件的開發平臺框架,你可以對它加以擴充套件整合到你自己的產品中。TPTP 可以通過 Eclipse update Manager 或者是安裝包進行安裝,安裝成功後會在 eclipse 中增加如下所示的按鈕,另外一個專門的用於檢查 TPTP profiling 結果的 perspective 也會新增進 eclipse 中,如下圖所示:


CodePro Profiler 是由 instantiations 公司推出的一款商用 eclipse 外掛,它可以通過 Eclipse update Manager 進行安裝或者是將安裝包直接解壓縮後儲存在 eclipse 的指定目錄下。與 TPTP 類似,安裝成功後,有一個專門的用於檢視 CodePro profiling 結果的 perspective 會新增進 eclipse 中,如下圖所示:


YourKit Java Profiler 也是一款商用軟體,支援的作業系統包括:Windows, Linux, FreeBSD, Mac OS X, Solaris 以及 HP-UX;支援的 IDE 包括:Eclipse, JBuilder, JDeveloper, NetBeans 以及 Intellij IDEA。安裝成功且首次啟動 YourKit Java Profiler 後,會彈出一個對話方塊,讓使用者選擇 YourKit Java Profiler 要整合進的 IDE,並指定該 IDE 的安裝路徑,點選”Install Plugin”按鈕並整合成功之後,Eclipse 中會出現如下圖示,使用者就可以從 Eclipse 中啟動 Profiling,但是 profiling 的結果需要在 YourKit Java Profiler 中進行查詢,如下圖所示:

JProfiler 是由 ej-technologies 推出的一款商用軟體,支援的作業系統有:Windows, Linux, Mac OS X, FreeBSD, Solaris, AIX 以及 HP-UX;支援的 IDE 包括:Eclipse, NetBeans, Intellij IDEA, JBuiler 以及 JDeveloper。安裝成功並首次啟動 JProfiler 後,會彈出一個設定介面,當完成左欄所示的那些步驟後,Eclipse 中就會出現如下圖示,使用者就可以從 Eclipse 中啟動 Profiling。與 YourKit Java Profiler 類似,profiling 的結果需要在 JProfiler 中進行查詢,如下圖所示:


本章節將從如下幾個方面對上述工具進行比較:

  • 與 Eclipse 的整合性 
    • TPTP:是一款基於 Eclipse 開發的外掛,因此與 eclipse 的整合性很好。安裝成功後,對 TPTP 的一切設定與操控都可以在 eclipse 中完成;另外,profiling 的結果也可以在 eclipse 中進行查詢。 
    • CodePro Profiler: 與 TPTP 類似,CodePro Profiler 也是一款基於 eclipse 開發的外掛,因此與 eclipse 的整合性很好好。使用者在 eclipse 中就可以完成對 profiling 的所有操作。 
    • YourKit Java Profiler: YourKit Java Profiler 可以說是一個比較獨立的工具,安裝成功後,使用者可以直接在 eclipse 中啟動 YourKit Java Profiler 並對 profiling 選項進行配置,但是使用者必須在 YourKit Java Profiler 工具中對 Profiling preferrence 進行配置,而且 profiling 資訊必須在 YourKit Java Profiler 中進行檢視。因此和 Eclipse 的整合度一般。 
    • JProfiler: JProfiler 也是一款比較獨立的工具,安裝成功後,使用者可以直接在 eclipse 中啟動 JProfiler,其他所有操作必須回到 JProfiler 工具中進行。因此和 Eclipse 的整合性不好。 
  • 遙測種類 
    • TPTP:目前使用的 4.6.2 的版本只提供了執行緒 Telemetry。 
    • CodePro Profiler: 總共有五個型別:CPU, 記憶體 , 執行緒 , 載入的類以及垃圾收集。 
    • YourKit Java Profiler: 與 CodePro Profiler 相比,缺少載入類的監測。 
    • JProfiler: 與 CodePro Profiler 一樣,總共有五個型別的監測方法。 
  • CPU 快照包含的統計資料型別 
    • TPTP: CPU 快照包含的統計資料有: 
      • 包的組成關係,細化到包含的類及類中的方法。 
      • 方法的呼叫關係:以每個執行緒為根節點的方法呼叫資訊,對於樹中出現的代表方法的每個節點,列出了該方法的執行時間或執行時間百分比,以及該方法被呼叫的次數。 
      • 方法被呼叫情況:列出了直接呼叫某方法的其他方法,以及這些方法呼叫該方法的次數及相關執行時間。 
      • 熱點列表:包含了 CPU 佔用時間排列前十的方法、類或包。 
    • CodePro Profiler: CPU 快照包含的統計資料型別有: 
      • 包的組成關係,細化到包含的類及類中的方法。 
      • 方法的呼叫關係。以樹結構表示,根據根節點表示的物件的不同,分為三種類型:以每個執行緒為根節點的方法呼叫關係,以整個執行緒為根節點的方法呼叫關係,以及以每個方法為根節點的方法呼叫關係。對於樹中出現的代表方法的每個節點,列出了該方法的執行時間或執行時間百分比,以及由該方法生成的物件個數和為這些物件分配的記憶體大小。 
      • 方法的被呼叫關係。該關係以樹結構表示,其中根節點為某個指定的方法,每個節點的子節點為父節點的呼叫者。 
      • 熱點列表:包含了 CPU 佔用時間排前的一些方法。 
    • YourKit Java Profiler:CPU 快照包含的統計資料型別與 CodePro Profiler 類似; 
    • JProfiler:與 CodePro Profiler 相比,缺少以每個方法為根節點的方法呼叫關係。因此當要檢視以某個方法為呼叫起點的呼叫關係時,需要到以執行緒為根的樹結構當中去查詢。另外,方法的被呼叫關係不是以樹結構來表示的,而是以圖的方式來顯示的,當呼叫關係比較複雜的時候,很難在一個螢幕中看到一個全域性關係圖。 
  • 記憶體快照包含的統計資料型別 
    • TPTP:包含了類例項的記憶體分配情況,包括例項化的物件個數,以及這些物件的本身佔用記憶體的大小。相對於其它 Java Profiler 工具,TPTP 的記憶體快照包含的統計資料型別比較少。 
    • CodePro Profiler: 包含的統計資料有 
      • 類例項的記憶體分配情況,包括例項化的物件個數,以及這些物件的 shallow 和 retained 大小。(Shallow size 就是物件本身佔用記憶體的大小,不包含對其他物件的引用;Retained size 是該物件自己的 shallow size,加上從該物件能直接或間接訪問到的 shallow size 之和,即該物件被 GC 之後所能回收到記憶體的總和)。 
      • 最大物件列表:包含了 retained 大小排前的一些物件。 
      • 有可能存在記憶體洩漏的物件列表:包含了有可能存在記憶體洩漏的物件以及可能性大小。 
    • YourKit Java Profiler:與 CodePro Profiler 相比,缺少記憶體洩露物件列表這一項。 
    • JProfiler:與 CodePro Profiler 相比,缺少 retained size 統計資料及記憶體洩露物件列表。 
  • 原始碼定位功能,即在快照中選中某個類、成員變數或者方法時,可以在原始碼中定位到對應的定義。 
    • TPTP:只能定位到某個類,無法定位到方法或其中的成員變數。 
    • CodePro Profiler: 擁有該功能,但是隻能定位到類及成員變數,無法定位到方法。 
    • YourKit Java Profiler:可以定位到類、成員變數及方法。 
    • JProfiler:與 CodePro Profiler 類似。 
  • 快照操作,主要從快照的獲取、快照的儲存及快照的比較這三方面進行比較。 
    • TPTP:當應用程式啟動後,使用者可以選擇在適當的時候進行快照獲取;這些快照不會自動儲存,因此當 eclipse 關閉後,這些快照資料將會消失,但是使用者可以通過 export 的方式將需要的快照儲存下來。 
    • CodePro Profiler: 當應用程式啟動後,使用者可以選擇在適當的時候進行快照獲取;這些快照會被自動儲存在 Eclipse Workspace 之外的一個臨時的空間,當 eclipse 關閉後,這些快照將會消失,使用者可以通過 export 的方式將需要的快照儲存下來;CodePro Profiler 還提供了快照的比較功能,不過前提是這兩個快照的型別必須相同(例如:都是以 sampling 模式或 BCI 模式執行的)。 
    • YourKit Java Profiler:當應用程式啟動後,使用者可以選擇在適當的時候進行快照獲取,針對記憶體快照,YourKit Java Profiler 還提供了自動獲取快照的功能;這些快照會被自動儲存到一個臨時的資料夾中,eclipse 關閉後,這些檔案不會消失;另外,YourKit Java Profiler 也提供了快照比較功能。 
    • JProfiler:工具會要求你指定一個目錄來儲存該 snapshot。 
  • 效能,在 sampling 模式下,這些工具的效能相差不大,這裡主要比較在 BCI 模式下的效能。 
    • TPTP:目前使用的 4.6.2 的版本沒有 BCI 模式。 
    • CodePro Profiler:當程式比較大的情況下,採用 BCI 模式進行 profiling 的速度比較慢;另外,在獲取記憶體洩露候選者的時候,速度也是相當慢。(當程式程式碼量 5 萬行時,用 CodePro Profiler 進行 Profiling 需要 5 分鐘,在獲取記憶體洩露候選者時,需要花費 20 分鐘) 
    • YourKit Java Profiler:BCI 模式下的執行速度還可以。(當程式程式碼量為 5 萬行時,需要 1 分鐘) 
    • JProfiler:感覺不出程式執行速度受影響。(當程式程式碼量為 5 萬行時,需要半分鐘) 
  • 健壯性,採用 CodePro Profiler 對比較大的應用程式進行 profiling 時,很容易出現棧溢位的錯誤。 

結論

TPTP 是一款基於 eclipse 的開源軟體,且提供的功能比較簡單,因此適用於基於 eclipse 開發的應用程式,且該應用程式比較簡單的情況;Codepro Profiler 提供的功能相對來說比較豐富,且與 eclipse 的整合性很好,但是在效能方面有待改善,因此適用於基於 eclipse 開發的應用程式,且對效能要求不高的情況;YourKit Java Profiler,JProfiler 與 Eclipse 的整合性都屬於一般,提供的功能也比較豐富,且效能不錯,因此適用於對 eclipse 整合度要求不高,且對效能要求較高的情況。

相關推薦

常用Java profiling工具分析比較

在 Java 程式的開發過程中,不可避免地會遇到記憶體使用、效能瓶頸等問題。Java Profiler 工具能幫助開發人員快速、有效地定位這些問題,因此成為了 Java 開發過程中的一個重要工具。目前市場上的 Java Profiler 工具種類繁多,本文將對目前比較常見

[轉載] 常用 Java Profiling 工具分析比較

原文: [url]http://www.ibm.com/developerworks/cn/java/j-lo-profiling/[/url]原作者:周 鵬, CSTL 軟體工程師, IBM周鵬,CSTL 軟體工程師,從事過三年 Mainframe 上系統軟體的開發,一年

常用 Java 靜態程式碼分析工具分析比較

簡介: 本文首先介紹了靜態程式碼分析的基本概念及主要技術,隨後分別介紹了現有 4 種主流 Java 靜態程式碼分析工具

常用軟體測試工具介紹分析

隨著軟體測試的地位逐步提高,測試的重要性逐步顯現,測試工具的應用已經成為了普遍的趨勢。目前用於測試的工具已經比較多了,測試工具的應用可以提高測試的質量、測試的效率、減少測試過程中的重複勞動、實現測試自動化,這些測試工具一般可分為白盒測試工具、黑盒測試工具、效能測試工具,另外還

Java集合體繫結構分析比較

1.  Java集合框架圖 Java平臺提供了一個全新的集合框架。“集合框架”主要由一組用來操作物件的介面組成。不同介面描述一組不同資料型別。 Java集合框架圖如下:   集合介面:6個介面(短虛線表示),表示不同集合型別,是集合框架的基礎。 抽象類:5個

五種智能算法解決最大割問題分析比較_愛學術

測試結果 最大 計算 遺傳算法 網絡 -c field author 粒子 【摘要】最大割問題(Max-cut Problem)是一個典型的NP難組合優化問題。文章采用遺傳算法、分布估計算法、Hopfield網絡方法、蟻群算法、粒子群算法等5種算法對最大割問題進行求解,並用

常用網絡工具認識使用

mar 設定 字段 固定ip 紅色 五類 選擇 p地址 並排 常用的網絡工具包括:網線測試儀,光功率計,光模塊認識,網線制作,IP-KVM 還有光纖擴容器,多功能查線儀等 現在主要要認識:網線測試儀,光功率計和IP-KVM的這三類機房常用工具的使用方法 1.網線測試儀定義:

OpenCV學習筆記(30)KAZE 演算法原理原始碼分析(四)KAZE特徵的效能分析比較

      KAZE系列筆記: 1.  OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2.  OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構

常用Java開發工具

tab 實現 linked acc 方便 互斥 定義 advice filter common:LruLinkedHashMap:一個支持Lru算法的LinkedHashMap. 源碼地址:點擊打開鏈接MD5:MD5工具類

202.常用java時間工具

1. 效果     2. 工具類 package ipi.common.utils; import java.text.Format; import java.text.ParseException; import java.text.SimpleDa

Apache Hadoop第三方Hadoop-CDH,HDP,MapR的分析比較

一、Hadoop版本綜述 目前Hadoop發行版非常多,有華為發行版、Intel發行版、Cloudera發行版(CDH)等,所有這些發行版均是基於Apache Hadoop衍生出來的,之所以有這麼多的版本,完全是由Apache Hadoop的開源協議決定的:任何人可

列舉建立單例模式和懶漢式加鎖單例模式分析比較

列舉建立單例的模式的優勢比較:方式優點缺點餓漢式執行緒安全, 呼叫效率高不能延遲載入懶漢式執行緒安全, 可以延遲載入呼叫效率不高雙重檢測鎖執行緒安全, 呼叫效率高, 可以延遲載入-靜態內部類執行緒安全, 呼叫效率高, 可以延遲載入-列舉執行緒安全, 呼叫效率高不能延遲載入列舉

幾種常見的中文分詞包的分析比較

1:中文分詞簡介 2:Lucence的中文分詞 3:庖丁分詞簡介 4:IK中文分詞簡介 一:中文分詞簡介     1:分詞演算法分類         -----基於字串匹配的中文分詞方法                eg:句子:我來自瀋陽航空航天大學          

【React自制全家桶】四、React中stateprops的分析比較

一.state   1.state的作用     state是React中元件的一個物件.React把使用者介面當做是狀態機,想象它有不同的狀態然後渲染這些狀態,可以輕鬆讓使用者介面與資料保持一致.      React中,更新元件的state,會導致重新渲染使用者介面

Java排序演算法分析實現:快排、氣泡排序、選擇排序、插入排序、歸併排序(一)

轉載  https://www.cnblogs.com/bjh1117/p/8335628.html   一、概述:   本文給出常見的幾種排序演算法的原理以及java實現,包括常見的簡單排序和高階排序演算法,以及其他常用的演算法知識。   簡單排序:氣泡排序、選擇排序、

各種排序演算法分析比較

1.直接插入排序 每一趟將一個待排序的元素作為關鍵字,按照其關鍵字的大小插入到已經排好的部分序列的適當位置上。平均時間複雜度為O(n2),空間複雜度為O(1)。 void InsertSort(int R[], int n) { if (R == nullptr ||

(考研必看)最全資料結構排序演算法效能分析比較!!!

資料結構所有排序演算法效能分析與比較 轉載請標明出處weixin_44254963或璇小姐 通過對資料結構的學習,我發現數據結構中各種排序演算法的排序方法,過程,以及時間效能,空間效能都比較容易混淆,現就這些情況做如下總結,希望對大家有所幫助。 起泡排序(氣泡排序) 首先取第一個

Java Comparable介面分析實踐

此介面對實現它的每個類的物件進行整體排序。這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法。 實現此介面的物件列表(和陣列)可以通過Collections.sort或者Arrays.sort進行自動排序,這個兩個排序實現使用的時快速排序。實現此介

嵌入式開發中三種作業系統的分析比較

三種常用的嵌入式作業系統——Palm OS、Windows CE、Linux;在此基礎上、分析、比較這三種嵌入式作業系統,給出它們之間的 異同點及各自的適用範圍。 1 嵌入式系統與嵌入式作業系統 1.1 嵌入式系統 嵌入式系統是以嵌入式計算機為技術核心,面向使用者、面向產品、面向應用,軟硬體可裁減的,適用

TokuDB和InnoDB的讀寫分析比較

我們知道,在MySQL單機版本里面最流行的也是唯一支援全事務的引擎為INNODB。 其特點是資料本身是用B-TREE來組織,資料本身即是龐大的根據主鍵聚簇的B-TREE索引。 所以在這點上,寫入速度就會有些降低,因為要每