簡介:在 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 工具采用的信息收集方法通常是以上三種方法的任意組合。
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 過濾器(選擇需要關注的包、類)、取樣間隔時間的設置等。