JProfiler是唯一一款獲過(guò)獎的Java剖析器。JProfiler直觀(guān)的用戶(hù)界面能夠幫助你找到性能瓶頸,并指明你的內存漏洞和解決線(xiàn)程問(wèn)題。
JProfiler's 特征:
- 內存剖析
JProfiler的內存視圖部分可以提供動(dòng)態(tài)的內存使用狀況更新視圖和顯示關(guān)于內存分配狀況信息的視圖。所有的視圖都有幾個(gè)聚集層并且能夠顯示現有存在的對象和作為垃圾回收的對象。
- 所有對象
顯示類(lèi)或在狀況統計和尺碼信息堆上所有對象的包。你可以標記當前值并顯示差異值。
- 記錄對象
顯示類(lèi)或所有已記錄對象的包。你可以標記出當前值并且顯示差異值。
- 分配請求樹(shù)
顯示一棵請求樹(shù)或者方法、類(lèi)、包或對已選擇類(lèi)有帶注釋的分配信息的J2EE組件。
- 分配熱點(diǎn)
顯示一個(gè)列表,包括方法、類(lèi)、包或分配已選類(lèi)的J2EE組件。你可以標注當前值并且顯示差異值。對于每個(gè)熱點(diǎn)都可以顯示它的跟蹤記錄樹(shù)。
堆遍歷
在JProfiler的堆遍歷器中,你可以對堆的狀況進(jìn)行快照并且可以通過(guò)選擇步驟下尋找感興趣的對象。堆遍歷器有五個(gè)視圖:
- 類(lèi)
顯示所有類(lèi)和它們的實(shí)例。
- 分配
為所有記錄對象顯示分配樹(shù)和分配熱點(diǎn)。
- 索引
為單個(gè)對象和“顯示到垃圾回收根目錄的路徑”提供索引圖的顯示功能。還能提供合并輸入視圖和輸出視圖的功能。
- 數據
為單個(gè)對象顯示實(shí)例和類(lèi)數據。
- 時(shí)間
顯示一個(gè)對已記錄對象的解決時(shí)間的柱狀圖。
CPU剖析器
JProfiler提供不同的方法來(lái)記錄請求樹(shù)以?xún)?yōu)化性能和細節。線(xiàn)程或者線(xiàn)程組以及線(xiàn)程狀況可以被所有的視圖選擇。所有的視圖都可以聚集到方法、類(lèi)、包或J2EE組件等不同層上。CPU視圖部分包括:
- 請求樹(shù)
顯示一個(gè)積累的自頂向下的樹(shù),樹(shù)中包含所有在JVM中已記錄的請求隊列。JDBC,JMS和JNDI服務(wù)請求都被注釋在請求樹(shù)中。請求樹(shù)可以根據servlet和JSP對URL的不同需要進(jìn)行拆分。
- 熱點(diǎn)
顯示消耗時(shí)間最多的方法的列表。對每個(gè)熱點(diǎn)都能夠顯示回溯樹(shù)。該熱點(diǎn)可以按照方法請求,JDBC,JMS和JNDI服務(wù)請求以及按照URL請求來(lái)進(jìn)行計算。
- 請求圖
顯示一個(gè)從已選方法、類(lèi)、包或J2EE組件開(kāi)始的請求隊列的圖。
線(xiàn)程剖析
對線(xiàn)程剖析,JProfiler提供以下視圖:
- 線(xiàn)程歷史
顯示一個(gè)與線(xiàn)程活動(dòng)和線(xiàn)程狀態(tài)在一起的活動(dòng)時(shí)間表.
- 線(xiàn)程監控
顯示一個(gè)列表,包括所有的活動(dòng)線(xiàn)程以及它們目前的活動(dòng)狀況。
- 固定探測圖表
顯示一個(gè)包含了所有在JVM里的固定的圖表。
- 目前使用的監測器
顯示目前使用的監測器并且包括它們的關(guān)聯(lián)線(xiàn)程。
- 歷史檢測記錄
顯示重大的等待事件和阻塞事件的歷史記錄。
- 監測使用狀態(tài)
顯示分組監測,線(xiàn)程和監測類(lèi)的統計監測數據。
VM 遙感勘測技術(shù)
觀(guān)察JVM的內部狀態(tài),JProfiler提供了不同的遙感勘測視圖,如下所示:
- 堆
顯示一個(gè)堆的使用狀況和堆尺寸大小活動(dòng)時(shí)間表。
- 對象
顯示一張關(guān)于活動(dòng)對象與數組的圖表的活動(dòng)時(shí)間表。
- Garbage collector
顯示一張關(guān)于垃圾回收活動(dòng)的活動(dòng)時(shí)間表。
- 類(lèi)
顯示一個(gè)與已裝載類(lèi)的圖表的活動(dòng)時(shí)間表。
- 線(xiàn)程
顯示一個(gè)與動(dòng)態(tài)線(xiàn)程圖表的活動(dòng)時(shí)間表。
1. JProfiler運行環(huán)境配置
安裝目錄結構如下,子目錄中顯示了支持的操作系統:
在服務(wù)器和客戶(hù)端都要安裝JProfiler,并且要安裝License,在分析工具客戶(hù)端中進(jìn)行安裝。Windows環(huán)境中運行客戶(hù)端程序:
jprofiler5.1.4\bin\jprofiler.exe
在UNIX系統中運行客戶(hù)端程序,執行shell腳本:
jprofiler5.1.4\bin\jprofiler
需要安裝License之后才能使用,請使用合法License。
2.分析獨立Java應用
啟動(dòng)Start Center:
點(diǎn)擊<New Session>,進(jìn)入Session設置界面:
l 輸入Session的名稱(chēng);
l Session Type選擇Local;
l 選擇本機安裝的JVM;
l 設置工作目錄,工作目錄是分析過(guò)程中存放數據的位置;
l 如果需要的話(huà)設置JVM的啟動(dòng)參數;
l 設置Java應用的main類(lèi);
l 設置Java應用的啟動(dòng)參數;
l 然后在下面的Java File Path輸入框中添加Java應用運行要用到的所有classpath和JAR包。
在Start Center中用<Start>按鈕啟動(dòng)配置好的Java應用:
3.分析JBoss中的應用
在分析客戶(hù)機打開(kāi)Start Center:
點(diǎn)擊<New Server Integration>進(jìn)入應用服務(wù)器的配置界面:
選擇合適版本的JBoss,點(diǎn)擊<Next>進(jìn)入下一步:
對于J2EE服務(wù)器分析,建議采用遠程模式,并選擇服務(wù)器的操作系統類(lèi)型,點(diǎn)擊<Next>進(jìn)入下一步:
輸入遠程服務(wù)器的地址,然后點(diǎn)擊<Next>進(jìn)入下一步:
輸入遠程服務(wù)器上安裝JProfiler的目錄,然后點(diǎn)擊<Next>進(jìn)入下一步:
輸入遠程服務(wù)器上JBoss的啟動(dòng)批處理程序目錄位置及文件名,可以先將該批處理文件拷貝到分析客戶(hù)機,然后選擇該批處理程序,向導程序會(huì )修改該批處理程序,添加加載JProfiler服務(wù)端程序的命令參數,然后創(chuàng )建新的批處理程序,原來(lái)的批處理程序保留不變。然后點(diǎn)擊<Next>進(jìn)入下一步:
選擇服務(wù)器端JVM的提供商,JVM版本和JVM的運行模式,如果是64位JVM,還要勾選該選項,然后點(diǎn)擊<Next>進(jìn)入下一步:
設定遠程JProfile分析服務(wù)的端口號,缺省端口號是8849,然后點(diǎn)擊<Next>進(jìn)入下一步:
選擇服務(wù)器端JProfiler的啟動(dòng)模式,一般選擇等待JProfiler GUI連接的方式。由于JVM首先加載JProfiler的服務(wù)端代理程序,JProfiler分析服務(wù)會(huì )停止JVM繼續啟動(dòng),等待JProfiler GUI連接,連接成功后服務(wù)器的JVM才會(huì )繼續啟動(dòng),分析配置信息會(huì )從客戶(hù)端傳遞給服務(wù)端,例如。
如果選擇不等待的模式,那么服務(wù)端的配置會(huì )復雜些,要將分析客戶(hù)端JProfiler產(chǎn)生的config.xml拷貝到服務(wù)器端,然后在服務(wù)器啟動(dòng)時(shí)候自動(dòng)加載該配置文件,分析客戶(hù)端和服務(wù)器連接的時(shí)候,不再將分析配置信息傳遞給服務(wù)端,客戶(hù)端分析工具的配置id要和服務(wù)端的配置id一致,例如:-agentlib:jprofilerti=port=8849,nowait,id=106,config= D:\jTools\jprofiler5.1.4\config.xml
然后點(diǎn)擊<Next>進(jìn)入下一步,進(jìn)入配置總覽界面:
然后點(diǎn)擊<Next>進(jìn)入下一步,進(jìn)入最后一步生成session,以及修改過(guò)的服務(wù)器啟動(dòng)腳本run_jprofiler.bat:
在run_jprofiler.bat中可以發(fā)現類(lèi)似于以下的修改內容:
rem The following lines have been added by the
rem application server integration wizard of JProfiler
set PATH=D:\jTools\jprofiler5.1.4\bin\windows;%PATH%
set JAVA_OPTS=-agentlib:jprofilerti=port=8849 "-Xbootclasspath/a:D:\jTools\jprofiler5.1.4\bin\agent.jar" %JAVA_OPTS%
rem end of modifications
在Start Center中添加了一個(gè)Session配置條目:
如果是Windows環(huán)境,那么這些配置存放在登錄用戶(hù)的目錄中,類(lèi)似于:C:\Documents and Settings\UserName\.jprofiler5\config.xml
4.分析WebSphere中的應用
配置WebSphere和配置JBoss類(lèi)似,關(guān)注以下步驟,修改服務(wù)器配置:
上圖是選擇WebSphere服務(wù)器的配置文件,一般操作是先把遠程服務(wù)器上的配置文件server.xml拷貝到分析客戶(hù)端的機器上,該文件的位置在E:\IBM\WebSphere61\AppServer\profiles\AppSrv01\config\cells\machine1Node01Cell\nodes\machine1Node01\servers\server1\server.xml。
修改服務(wù)啟動(dòng)腳本,將服務(wù)器啟動(dòng)腳本也拷貝到本地進(jìn)行修改:
把修改后的server.xml和啟動(dòng)服務(wù)腳本拷貝回服務(wù)器上。
server.xml的修改主要是添加了類(lèi)似于下面紅色標出的內容:
<processDefinitions xmi:type="processexec:JavaProcessDef" xmi:id="JavaProcessDef_1120677326792" workingDirectory="${USER_INSTALL_ROOT}" startCommand="" stopCommand="" terminateCommand="" processType="Single">
<executableArguments />
<execution xmi:id="ProcessExecution_1120677326792" processPriority="20" runAsUser="" runAsGroup="" />
<ioRedirect xmi:id="OutputRedirect_1120677326792" stdoutFilename="${LOG_ROOT}/${SERVER}/native_stdout.log" stderrFilename="${LOG_ROOT}/${SERVER}/native_stderr.log" />
<jvmEntries xmi:id="JavaVirtualMachine_1120677326792" verboseModeClass="false" verboseModeGarbageCollection="false" verboseModeJNI="false" runHProf="false" hprofArguments="" debugMode="false"
debugArgs="-Djava.compiler=NONE -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7777"
genericJvmArguments="-agentlib:jprofilerti=port=8849 -Xbootclasspath/a:G:\jprofiler\bin\agent.jar">
<classpath />
<bootClasspath />
</jvmEntries>
</processDefinitions>
startServer_jprofiler.sh中增加類(lèi)似于以下的內容:
LIBPATH="/oracle/jprofiler/bin/aix-ppc64:$LIBPATH"
export LIBPATH
5. 基本分析
5.1 內存分析
查看JVM中內存對象的數量及占用空間:
5.2
5.2 代碼執行時(shí)間分析
查看方法調用花費的時(shí)間及調用次數:
(#)