小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 ShangShujie 2010-08-14

 

簡(jiǎn)介: 

在 Java 程序的開(kāi)發(fā)過(guò)程中,不可避免地會(huì)遇到內(nèi)存使用、性能瓶頸等問(wèn)題。Java Profiler 工具能幫助開(kāi)發(fā)人員快速、有效地定位這些問(wèn)題,因此成為了 Java 開(kāi)發(fā)過(guò)程中的一個(gè)重要工具。目前市場(chǎng)上的 Java Profiler 工具種類(lèi)繁多,本文將對(duì)目前比較常見(jiàn)的幾種工具進(jìn)行簡(jiǎn)要介紹,并從功能、性能等角度作比較,從而幫助 Java 程序員選擇合適的 Java Profiler 工具。

本文主要分為三個(gè)部分:第一部分簡(jiǎn)要介紹 Java Profiler 工具的原理;第二部分對(duì)目前常見(jiàn)的 Java Profiler 工具 TPTP, CodePro Profiler, YourKit Java Profiler, JProfiler 進(jìn)行簡(jiǎn)要介紹;第三部分對(duì)以上工具從不同的角度進(jìn)行比較,幫助開(kāi)發(fā)人員選擇合適的工具。

發(fā)布日期: 2010 年 8 月 13 日
級(jí)別: 初級(jí)
建議: 0 (添 加評(píng)論)

1 star2
stars3
stars4
stars5
stars 平均分 (共 1 個(gè)評(píng)分 )

相對(duì)于靜態(tài)代碼分析,Profiling 是通過(guò)收集程序運(yùn)行時(shí)的信息來(lái)研究程序行為的動(dòng)態(tài)分析方法。其目的在于定位程序需要被優(yōu)化的部分,從而提高程序的運(yùn)行速度或是內(nèi)存使用效率。收集程序運(yùn)行 時(shí)信息的方法主要有以下三種:

  • 事件方法:對(duì)于 Java,可以采用 JVMTI(JVM Tools Interface)API 來(lái)捕捉諸如方法調(diào)用、類(lèi)載入、類(lèi)卸載、進(jìn)入 / 離開(kāi)線程等事件,然后基于這些事件進(jìn)行程序行為的分析。
  • 統(tǒng)計(jì)抽樣方法(sampling): 該方法每隔一段時(shí)間調(diào)用系統(tǒng)中斷,然后收集當(dāng)前的調(diào)用棧(call stack)信息,記錄調(diào)用棧中出現(xiàn)的函數(shù)及這些函數(shù)的調(diào)用結(jié)構(gòu),基于這些信息得到函數(shù)的調(diào)用關(guān)系圖及每個(gè)函數(shù)的 CPU 使用信息。由于調(diào)用棧的信息是每隔一段時(shí)間來(lái)獲取的,因此不是非常精確的,但由于該方法對(duì)目標(biāo)程序的干涉比較少,目標(biāo)程序的運(yùn)行速度幾乎不受影響。
  • 植入附加指令方法(BCI): 該方法在目標(biāo)程序中插入指令代碼,這些指令代碼將記錄 profiling 所需的信息,包括運(yùn)行時(shí)間、計(jì)數(shù)器的值等,從而給出一個(gè)較為精確的內(nèi)存使用情況、函數(shù)調(diào)用關(guān)系及函數(shù)的 CPU 使用信息。該方法對(duì)程序執(zhí)行速度會(huì)有一定的影響,因此給出的程序執(zhí)行時(shí)間有可能不準(zhǔn)確。但是該方法在統(tǒng)計(jì)程序的運(yùn)行軌跡方面有一定的優(yōu)勢(shì)。

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

Profiler 工具功能簡(jiǎn)介

雖然市場(chǎng)上的 Java Profiler 工具有不少,但是基本功能大多相似,本節(jié)首先對(duì)這些基本功能進(jìn)行介紹。

  • 遙測(cè)(Telemetry):遙測(cè)是一種用來(lái)查看應(yīng)用程序運(yùn)行行為的最簡(jiǎn)單的方法。通常會(huì)有多個(gè)視圖(View)分別實(shí)時(shí)地顯示 CPU 使用情況、內(nèi)存使用情況、線程狀態(tài)以及其他一些有用的信息,以便用戶(hù)能很快地發(fā)現(xiàn)問(wèn)題的關(guān)鍵所在。
    • CPU Telemetry 視圖一般用于顯示整個(gè)應(yīng)用程序的 CPU 使用情況,有些工具還能顯示應(yīng)用程序中每個(gè)線程的 CPU 使用情況。
    • Memory Telemetry 視圖一般用于顯示堆內(nèi)存和非堆內(nèi)存的分配和使用情況。
    • Garbage Collection Telemetry 視圖顯示了 JVM 中垃圾收集器的詳細(xì)信息。
    • Threads Telemetry 視圖一般用于顯示當(dāng)前運(yùn)行線程的個(gè)數(shù)、守護(hù)進(jìn)程的個(gè)數(shù)等信息。
    • Classes Telemetry 視圖一般用于顯示已經(jīng)載入和還沒(méi)有載入的類(lèi)的數(shù)量。
  • 快照(snapshot):應(yīng)用程序啟動(dòng)后,profiler 工具開(kāi)始收集各種執(zhí)行數(shù)據(jù),其中一些數(shù)據(jù)直接顯示在遙測(cè)視圖中,而另外大部分?jǐn)?shù)據(jù)被保存在內(nèi)部,直到用戶(hù)要求獲取快照,基于這些保存的數(shù)據(jù)的統(tǒng)計(jì)信息才被 顯示出來(lái)。快照包含了應(yīng)用程序在一段時(shí)間內(nèi)的執(zhí)行信息,通常有兩種類(lèi)型的快照:CPU 快照和內(nèi)存快照。
    • CPU 快照主要包含了應(yīng)用程序中函數(shù)的調(diào)用關(guān)系及運(yùn)行時(shí)間,這些信息通常可以在 CPU 快照視圖中進(jìn)行查看。
    • 內(nèi)存快照則主要包含了內(nèi)存的分配和使用情況、載入的所有類(lèi)、存在的對(duì)象信息及對(duì)象間的引用關(guān)系。這些信息通??梢栽趦?nèi)存快照視圖中進(jìn) 行查看。
  • CPU Profiling:CPU Profiling 的主要目的是統(tǒng)計(jì)函數(shù)的調(diào)用情況及執(zhí)行時(shí)間,或者更簡(jiǎn)單的情況就是統(tǒng)計(jì)應(yīng)用程序的 CPU 使用情況。通常有兩種方式來(lái)顯示 CPU Profiling 結(jié)果:CPU 遙測(cè)和 CPU 快照。
  • 內(nèi)存 Profiling:內(nèi)存 Profiling 的主要目的是通過(guò)統(tǒng)計(jì)內(nèi)存使用情況檢測(cè)可能存在的內(nèi)存泄露問(wèn)題及確定優(yōu)化內(nèi)存使用的方向。通常有兩種方式來(lái)顯示內(nèi)存 Profiling 結(jié)果:內(nèi)存遙測(cè)和內(nèi)存快照
  • 線程 Profiling:線程 Profiling 主要用于在多線程應(yīng)用程序中確定內(nèi)存的問(wèn)題所在。 一般包括三個(gè)方面的信息:
    • 某個(gè)線程的狀態(tài)變化情況
    • 死鎖情況
    • 某個(gè)線程在線程生命期內(nèi)狀態(tài)的分布情況
  • Profiling 的啟動(dòng)設(shè)置:類(lèi)似于 eclipse 中 Run 和 Debug 的啟動(dòng)設(shè)置,進(jìn)行 Profiling 之前也需要進(jìn)行啟動(dòng)設(shè)置,包括:profiling 的模式 (CPU profiling 或內(nèi)存 profiling),信息獲取類(lèi)型(遙測(cè) , 抽樣統(tǒng)計(jì)或者 BCI ) 等等。
  • Profiler Preference 設(shè)置:主要用于 Profiler 過(guò)濾器(選擇需要關(guān)注的包、類(lèi))、取樣間隔時(shí)間的設(shè)置等。

Java Profiler 工具介紹

本文接下來(lái)將對(duì)目前市場(chǎng)上常見(jiàn)的幾種 Java Profiler 工具進(jìn)行介紹。

TPTP

TPTP(Test and Performance Tools Platform)是 eclipse 官方的 Profiling 工具插件。TPTP 提供了諸如測(cè)試,追蹤(trace),性能測(cè)試,圖形界面性能分析等功能。同時(shí) TPTP 還是一個(gè)可擴(kuò)展的開(kāi)發(fā)平臺(tái)框架,你可以對(duì)它加以擴(kuò)展集成到你自己的產(chǎn)品中。TPTP 可以通過(guò) Eclipse update Manager 或者是安裝包進(jìn)行安裝,安裝成功后會(huì)在 eclipse 中增加如下所示的按鈕,另外一個(gè)專(zhuān)門(mén)的用于檢查 TPTP profiling 結(jié)果的 perspective 也會(huì)添加進(jìn) eclipse 中,如下圖所示:


圖 1. TPTP
圖 1. tptp

CodePro Profiler

CodePro Profiler 是由 instantiations 公司推出的一款商用 eclipse 插件,它可以通過(guò) Eclipse update Manager 進(jìn)行安裝或者是將安裝包直接解壓縮后保存在 eclipse 的指定目錄下。與 TPTP 類(lèi)似,安裝成功后,有一個(gè)專(zhuān)門(mén)的用于查看 CodePro profiling 結(jié)果的 perspective 會(huì)添加進(jìn) eclipse 中,如下圖所示:


圖 2. CodePro
圖 2. codepro

YourKit Profiler

YourKit Java Profiler 也是一款商用軟件,支持的操作系統(tǒng)包括:Windows, Linux, FreeBSD, Mac OS X, Solaris 以及 HP-UX;支持的 IDE 包括:Eclipse, JBuilder, JDeveloper, NetBeans 以及 Intellij IDEA。安裝成功且首次啟動(dòng) YourKit Java Profiler 后,會(huì)彈出一個(gè)對(duì)話框,讓用戶(hù)選擇 YourKit Java Profiler 要集成進(jìn)的 IDE,并指定該 IDE 的安裝路徑,點(diǎn)擊”Install Plugin”按鈕并集成成功之后,Eclipse 中會(huì)出現(xiàn)如下圖標(biāo),用戶(hù)就可以從 Eclipse 中啟動(dòng) Profiling,但是 profiling 的結(jié)果需要在 YourKit Java Profiler 中進(jìn)行查詢(xún),如下圖所示:


圖 3. YourKit
圖 3. yourkit

JProfiler

JProfiler 是由 ej-technologies 推出的一款商用軟件,支持的操作系統(tǒng)有:Windows, Linux, Mac OS X, FreeBSD, Solaris, AIX 以及 HP-UX;支持的 IDE 包括:Eclipse, NetBeans, Intellij IDEA, JBuiler 以及 JDeveloper。安裝成功并首次啟動(dòng) JProfiler 后,會(huì)彈出一個(gè)設(shè)置界面,當(dāng)完成左欄所示的那些步驟后,Eclipse 中就會(huì)出現(xiàn)如下圖標(biāo),用戶(hù)就可以從 Eclipse 中啟動(dòng) Profiling。與 YourKit Java Profiler 類(lèi)似,profiling 的結(jié)果需要在 JProfiler 中進(jìn)行查詢(xún),如下圖所示:


圖 4. JProfiler
圖 4. jprofiler

Java Profiler 工具比較

本章節(jié)將從如下幾個(gè)方面對(duì)上述工具進(jìn)行比較:

  • 與 Eclipse 的集成性
    • TPTP:是一款基于 Eclipse 開(kāi)發(fā)的插件,因此與 eclipse 的集成性很好。安裝成功后,對(duì) TPTP 的一切設(shè)置與操控都可以在 eclipse 中完成;另外,profiling 的結(jié)果也可以在 eclipse 中進(jìn)行查詢(xún)。
    • CodePro Profiler: 與 TPTP 類(lèi)似,CodePro Profiler 也是一款基于 eclipse 開(kāi)發(fā)的插件,因此與 eclipse 的集成性很好好。用戶(hù)在 eclipse 中就可以完成對(duì) profiling 的所有操作。
    • YourKit Java Profiler: YourKit Java Profiler 可以說(shuō)是一個(gè)比較獨(dú)立的工具,安裝成功后,用戶(hù)可以直接在 eclipse 中啟動(dòng) YourKit Java Profiler 并對(duì) profiling 選項(xiàng)進(jìn)行配置,但是用戶(hù)必須在 YourKit Java Profiler 工具中對(duì) Profiling preferrence 進(jìn)行配置,而且 profiling 信息必須在 YourKit Java Profiler 中進(jìn)行查看。因此和 Eclipse 的集成度一般。
    • JProfiler: JProfiler 也是一款比較獨(dú)立的工具,安裝成功后,用戶(hù)可以直接在 eclipse 中啟動(dòng) JProfiler,其他所有操作必須回到 JProfiler 工具中進(jìn)行。因此和 Eclipse 的集成性不好。
  • 遙測(cè)種類(lèi)
    • TPTP:目前使用的 4.6.2 的版本只提供了線程 Telemetry。
    • CodePro Profiler: 總共有五個(gè)類(lèi)型:CPU, 內(nèi)存 , 線程 , 載入的類(lèi)以及垃圾收集。
    • YourKit Java Profiler: 與 CodePro Profiler 相比,缺少載入類(lèi)的監(jiān)測(cè)。
    • JProfiler: 與 CodePro Profiler 一樣,總共有五個(gè)類(lèi)型的監(jiān)測(cè)方法。
  • CPU 快照包含的統(tǒng)計(jì)數(shù)據(jù)類(lèi)型
    • TPTP: CPU 快照包含的統(tǒng)計(jì)數(shù)據(jù)有:
      • 包的組成關(guān)系,細(xì)化到包含的類(lèi)及類(lèi)中的方法。
      • 方法的調(diào)用關(guān)系:以每個(gè)線程為根節(jié)點(diǎn)的方法調(diào)用信息,對(duì)于樹(shù)中出現(xiàn)的代表方法的每個(gè)節(jié)點(diǎn),列出了該方法的運(yùn)行時(shí)間或運(yùn)行時(shí)間百分 比,以及該方法被調(diào)用的次數(shù)。
      • 方法被調(diào)用情況:列出了直接調(diào)用某方法的其他方法,以及這些方法調(diào)用該方法的次數(shù)及相關(guān)運(yùn)行時(shí)間。
      • 熱點(diǎn)列表:包含了 CPU 占用時(shí)間排列前十的方法、類(lèi)或包。
    • CodePro Profiler: CPU 快照包含的統(tǒng)計(jì)數(shù)據(jù)類(lèi)型有:
      • 包的組成關(guān)系,細(xì)化到包含的類(lèi)及類(lèi)中的方法。
      • 方法的調(diào)用關(guān)系。以樹(shù)結(jié)構(gòu)表示,根據(jù)根節(jié)點(diǎn)表示的對(duì)象的不同,分為三種類(lèi)型:以每個(gè)線程為根節(jié)點(diǎn)的方法調(diào)用關(guān)系,以整個(gè)線程為根 節(jié)點(diǎn)的方法調(diào)用關(guān)系,以及以每個(gè)方法為根節(jié)點(diǎn)的方法調(diào)用關(guān)系。對(duì)于樹(shù)中出現(xiàn)的代表方法的每個(gè)節(jié)點(diǎn),列出了該方法的運(yùn)行時(shí)間或運(yùn)行時(shí)間百分比,以及由該方法 生成的對(duì)象個(gè)數(shù)和為這些對(duì)象分配的內(nèi)存大小。
      • 方法的被調(diào)用關(guān)系。該關(guān)系以樹(shù)結(jié)構(gòu)表示,其中根節(jié)點(diǎn)為某個(gè)指定的方法,每個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)為父節(jié)點(diǎn)的調(diào)用者。
      • 熱點(diǎn)列表:包含了 CPU 占用時(shí)間排前的一些方法。
    • YourKit Java Profiler:CPU 快照包含的統(tǒng)計(jì)數(shù)據(jù)類(lèi)型與 CodePro Profiler 類(lèi)似;
    • JProfiler:與 CodePro Profiler 相比,缺少以每個(gè)方法為根節(jié)點(diǎn)的方法調(diào)用關(guān)系。因此當(dāng)要查看以某個(gè)方法為調(diào)用起點(diǎn)的調(diào)用關(guān)系時(shí),需要到以線程為根的樹(shù)結(jié)構(gòu)當(dāng)中去查找。另外,方法的被調(diào)用 關(guān)系不是以樹(shù)結(jié)構(gòu)來(lái)表示的,而是以圖的方式來(lái)顯示的,當(dāng)調(diào)用關(guān)系比較復(fù)雜的時(shí)候,很難在一個(gè)屏幕中看到一個(gè)全局關(guān)系圖。
  • 內(nèi)存快照包含的統(tǒng)計(jì)數(shù)據(jù)類(lèi)型
    • TPTP:包含了類(lèi)實(shí)例的內(nèi)存分配情況,包括實(shí)例化的對(duì)象個(gè)數(shù),以及這些對(duì)象的本身占用內(nèi)存的大小。相對(duì)于其它 Java Profiler 工具,TPTP 的內(nèi)存快照包含的統(tǒng)計(jì)數(shù)據(jù)類(lèi)型比較少。
    • CodePro Profiler: 包含的統(tǒng)計(jì)數(shù)據(jù)有
      • 類(lèi)實(shí)例的內(nèi)存分配情況,包括實(shí)例化的對(duì)象個(gè)數(shù),以及這些對(duì)象的 shallow 和 retained 大小。(Shallow size 就是對(duì)象本身占用內(nèi)存的大小,不包含對(duì)其他對(duì)象的引用;Retained size 是該對(duì)象自己的 shallow size,加上從該對(duì)象能直接或間接訪問(wèn)到的 shallow size 之和,即該對(duì)象被 GC 之后所能回收到內(nèi)存的總和)。
      • 最大對(duì)象列表:包含了 retained 大小排前的一些對(duì)象。
      • 有可能存在內(nèi)存泄漏的對(duì)象列表:包含了有可能存在內(nèi)存泄漏的對(duì)象以及可能性大小。
    • YourKit Java Profiler:與 CodePro Profiler 相比,缺少內(nèi)存泄露對(duì)象列表這一項(xiàng)。
    • JProfiler:與 CodePro Profiler 相比,缺少 retained size 統(tǒng)計(jì)數(shù)據(jù)及內(nèi)存泄露對(duì)象列表。
  • 源代碼定位功能,即在快照中選中某個(gè)類(lèi)、成員變量或者方法時(shí),可以在源代碼中定位到對(duì)應(yīng)的定義。
    • TPTP:只能定位到某個(gè)類(lèi),無(wú)法定位到方法或其中的成員變量。
    • CodePro Profiler: 擁有該功能,但是只能定位到類(lèi)及成員變量,無(wú)法定位到方法。
    • YourKit Java Profiler:可以定位到類(lèi)、成員變量及方法。
    • JProfiler:與 CodePro Profiler 類(lèi)似。
  • 快照操作,主要從快照的獲取、快照的保存及快照的比較這三方面進(jìn)行比較。
    • TPTP:當(dāng)應(yīng)用程序啟動(dòng)后,用戶(hù)可以選擇在適當(dāng)?shù)臅r(shí)候進(jìn)行快照獲?。贿@些快照不會(huì)自動(dòng)保存,因此當(dāng) eclipse 關(guān)閉后,這些快照數(shù)據(jù)將會(huì)消失,但是用戶(hù)可以通過(guò) export 的方式將需要的快照保存下來(lái)。
    • CodePro Profiler: 當(dāng)應(yīng)用程序啟動(dòng)后,用戶(hù)可以選擇在適當(dāng)?shù)臅r(shí)候進(jìn)行快照獲??;這些快照會(huì)被自動(dòng)保存在 Eclipse Workspace 之外的一個(gè)臨時(shí)的空間,當(dāng) eclipse 關(guān)閉后,這些快照將會(huì)消失,用戶(hù)可以通過(guò) export 的方式將需要的快照保存下來(lái);CodePro Profiler 還提供了快照的比較功能,不過(guò)前提是這兩個(gè)快照的類(lèi)型必須相同(例如:都是以 sampling 模式或 BCI 模式運(yùn)行的)。
    • YourKit Java Profiler:當(dāng)應(yīng)用程序啟動(dòng)后,用戶(hù)可以選擇在適當(dāng)?shù)臅r(shí)候進(jìn)行快照獲取,針對(duì)內(nèi)存快照,YourKit Java Profiler 還提供了自動(dòng)獲取快照的功能;這些快照會(huì)被自動(dòng)保存到一個(gè)臨時(shí)的文件夾中,eclipse 關(guān)閉后,這些文件不會(huì)消失;另外,YourKit Java Profiler 也提供了快照比較功能。
    • JProfiler:工具會(huì)要求你指定一個(gè)目錄來(lái)保存該 snapshot。
  • 性能,在 sampling 模式下,這些工具的性能相差不大,這里主要比較在 BCI 模式下的性能。
    • TPTP:目前使用的 4.6.2 的版本沒(méi)有 BCI 模式。
    • CodePro Profiler:當(dāng)程序比較大的情況下,采用 BCI 模式進(jìn)行 profiling 的速度比較慢;另外,在獲取內(nèi)存泄露候選者的時(shí)候,速度也是相當(dāng)慢。(當(dāng)程序代碼量 5 萬(wàn)行時(shí),用 CodePro Profiler 進(jìn)行 Profiling 需要 5 分鐘,在獲取內(nèi)存泄露候選者時(shí),需要花費(fèi) 20 分鐘)
    • YourKit Java Profiler:BCI 模式下的運(yùn)行速度還可以。(當(dāng)程序代碼量為 5 萬(wàn)行時(shí),需要 1 分鐘)
    • JProfiler:感覺(jué)不出程序運(yùn)行速度受影響。(當(dāng)程序代碼量為 5 萬(wàn)行時(shí),需要半分鐘)
  • 健壯性,采用 CodePro Profiler 對(duì)比較大的應(yīng)用程序進(jìn)行 profiling 時(shí),很容易出現(xiàn)棧溢出的錯(cuò)誤。

結(jié)論

TPTP 是一款基于 eclipse 的開(kāi)源軟件,且提供的功能比較簡(jiǎn)單,因此適用于基于 eclipse 開(kāi)發(fā)的應(yīng)用程序,且該應(yīng)用程序比較簡(jiǎn)單的情況;Codepro Profiler 提供的功能相對(duì)來(lái)說(shuō)比較豐富,且與 eclipse 的集成性很好,但是在性能方面有待改善,因此適用于基于 eclipse 開(kāi)發(fā)的應(yīng)用程序,且對(duì)性能要求不高的情況;YourKit Java Profiler,JProfiler 與 Eclipse 的集成性都屬于一般,提供的功能也比較豐富,且性能不錯(cuò),因此適用于對(duì) eclipse 集成度要求不高,且對(duì)性能要求較高的情況。


參考資料

學(xué)習(xí)



作者簡(jiǎn)介

周鵬,CSTL 軟件工程師,從事過(guò)三年 Mainframe 上系統(tǒng)軟件的開(kāi)發(fā),一年 Director6.1 在 IBM pSeries 的測(cè)試工作以及測(cè)試環(huán)境的維護(hù)工作。目前負(fù)責(zé) Director6.1 與其他產(chǎn)品,如 IBM Tivoli, HP OVO, CA NSM 等的集成開(kāi)發(fā)工作。

徐曉琴,Verigy 軟件工程師,有多年 Java, C++ 的開(kāi)發(fā)經(jīng)驗(yàn)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多