本文通過介紹Optimizeit Profiler的一些主要特征來使你對它有個簡要的了解。如果想要知道更多的信息,請查看Optimizeit Profiler用戶手冊。可以從Optimizeit Profiler單擊主菜單info|help來查看所有的使用文檔。
使用中有何問題,請隨時與Borland Technical Support聯(lián)系。
啟動應(yīng)用程序
Optimizeit Profiler是通過在一個獨(dú)立的虛擬機(jī)上運(yùn)行應(yīng)用程序來收集有用的信息。
在運(yùn)行一個java程序前,需要安裝一個java虛擬機(jī)。Optimizeit Profiler默認(rèn)配置是JDK 1.4 or 1.4.1。如果你想使用的另外的虛擬機(jī),可以查看Optimizeit Profiler用戶手冊中的如何增加額外的虛擬機(jī)部分。
Optimizeit Profiler可用來測試任何類型的java程序:標(biāo)準(zhǔn)的應(yīng)用程序、應(yīng)用小程序、servlets、jsp,ejb等。本文所使用的都是演示程序,包含在Optimizeit quichktour目錄下。文中所有的演示均可以此來完成。
1、 打開Optimizeit Profiler;
2、 如果你是第一次打開,將會自動彈出編輯設(shè)置窗口。如果已經(jīng)打開,可以從file菜單下選擇new setting,調(diào)出編輯設(shè)置窗口。
3、 在程序類型框中選擇Application。
4、 單擊"Program main class or Jar file"右面的“Browse…”按鈕。
5、 找到\doc\profiler\quicktour\QuickTourApp.jar文件,然后單擊open。
6、 Profiler會返回到設(shè)置窗口,并且自動帶入程序的工作區(qū)和類路徑。在Source Path框中,單擊change…按鈕。
7、 在Source path chooser窗口中,選擇安裝路徑下的\doc\profiler\quicktour目錄;選中\doc\profiler\quicktour\QuickTourApp.jar文件后單擊窗口中的向下按鈕把它加入到source path部分。
8、 單擊ok增加到源文件中路徑中。設(shè)置好后的對話框如下:
9、 單擊Start now按鈕。
10、 編輯窗口會自動關(guān)閉,并且Optimizeit Profiler自動加載事例程序。
當(dāng)你是第一次使用該工具,Optimizeit自動打開到內(nèi)存監(jiān)視窗口:
內(nèi)存監(jiān)視器列出了被測程序中所有的類并且實(shí)時統(tǒng)計(jì)每個類的實(shí)例的數(shù)目。內(nèi)存監(jiān)視器默認(rèn)是以堆模式打開,這樣能夠看到對象的創(chuàng)建和撤銷。下面的步驟將演示將介紹如何控制內(nèi)存監(jiān)視器以便于分析被測程序的內(nèi)存使用情況:
1、 單擊內(nèi)存監(jiān)視器表頭的instance count。這樣將按照已分配的實(shí)例數(shù)來進(jìn)行降序排列。
2、 在內(nèi)存監(jiān)視器窗口下方的Filters窗口中,輸入你想觀察的某個類,在filters框中輸入Java.awt.*,并且按回車鍵;這樣將只顯示java.awt類的相關(guān)信息。
3、 我們可以看到,許多類的實(shí)例數(shù)要么增加,要么減少。增加是因?yàn)橛袑?shí)例生成,而減少是因?yàn)槔厥赵谄鹱饔谩H绻榭磁R時對象的創(chuàng)建,可以選中窗口右側(cè)底部的Disable garbage collector按鈕,這樣Optimizeit將一直持續(xù)顯示所有實(shí)例的數(shù)目。
4、 選中java.awt.Color類,然后單擊Allocation Backtrace
5、 在Allocation Backtrace視圖中,可以以兩種方式來查看信息:
l Hierarchical view分層模式 默認(rèn)顯示樹形圖。在樹形圖中,某個方法可能顯示在多個地方,在于誰調(diào)用了這個方法。但是在圖形視圖中,節(jié)點(diǎn)表示的方法僅顯示一次。它仍然可以有多個父路徑。
l In the Aggregated view圖表模式 每個節(jié)點(diǎn)將使用線連接起來,或者是到了邊界只有一邊有線。從有多個子節(jié)點(diǎn)開始,每條連線對應(yīng)一個調(diào)用這個方法的方法。與樹形不同的是,圖表中可能存在循環(huán)。圖表顯示有助于進(jìn)行跟蹤。如果你想找出一條語句是如何被調(diào)用的,那么圖表將是一種快速而簡易的方法,通過圖表你可以迅速地找出有父子關(guān)系的對象。
可以使用按鈕在兩種方式之間切換。
6、 選中EventDispatchThread.run()行,單擊左邊的加號展開。單擊比率最大的節(jié)點(diǎn),直到展開Graphics2d.fill3DRect()
行為止。
7、 雙擊
。Graphics2d.fill3DRect()行,將顯示顏色實(shí)例分配的源代碼。源代碼將有助于你理解為什么繪制路徑類產(chǎn)生了如此多的實(shí)例。fill3DRect方法分配了許多的顏色,是因?yàn)樗{(diào)用了Color.brighter()
方法and Color.darker()
方法
注意:如果你是第一次使用者,你可能沒有圖中的源代碼路徑。
使用內(nèi)存監(jiān)視器,可以幫助你創(chuàng)建更少的臨時對象。雖然臨時對象經(jīng)常很快便被析構(gòu),然而它會導(dǎo)致垃圾收集更加頻繁。對于大多數(shù)java虛擬機(jī)來說,當(dāng)垃圾收集器比較忙時,運(yùn)行任何的java程序都會延遲幾百毫秒。如果使用了過多的臨時對象,由于這個原因會致使用戶感覺到程序反應(yīng)緩慢。
內(nèi)存監(jiān)視器同時有助于理解為什么垃圾收集器沒有析構(gòu)這些對象。例如,它將幫助我們我們了解當(dāng)一個對象不再被使用時確實(shí)被垃圾收集器析構(gòu)掉。下面的步驟描述了使用內(nèi)存監(jiān)視器來判斷一個實(shí)例的產(chǎn)生和如何被垃圾收集器收集。
1、 單擊圖標(biāo)返回到堆模式。
2、 為了只顯示與Image-related相關(guān)的類,可以清除fileters框中的內(nèi)容,然后輸入*image*,然后按回車鍵。
3、 選中javax.swing.ImageIcon行,然后單擊圖標(biāo)
窗口的上方顯示了實(shí)例的字符描述。
窗口中間部分顯示了所選實(shí)例對象參考和由對象所派生的實(shí)例。在這種情況下,因?yàn)?/span>ImageIcon對象被引用了,所以垃圾收集器沒有收集。
窗口最下方部分顯示了中間窗口所選實(shí)例的分配路徑。可以看出實(shí)例是構(gòu)造器QuickTourApp分配的。這個圖像就是作為背景顯示在程序中間的Optimizeit的logo。
內(nèi)存泄漏經(jīng)常是由于在程序運(yùn)行中連續(xù)地引用對象,因此他們?nèi)匀徽加觅Y源。正因?yàn)槿绱耍绻隳軌蚨ㄎ坏绞褂么罅恳玫膶ο螅敲茨憔湍軌蚨ㄎ恢翆ο笳加觅Y源導(dǎo)致內(nèi)存泄漏的根源。為了能夠定位到使用大量引用的對象,并且跟蹤這些引用:
1、 打開內(nèi)存泄漏檢測,單擊內(nèi)存泄漏監(jiān)測按鈕
2、 為了查找可能的內(nèi)存泄漏,Profiler需要比較一系列堆的狀態(tài)。可以單擊保存堆狀態(tài)按鈕
3、 讓quicktour程序運(yùn)行15秒以上。
4、 再次單擊保存堆狀態(tài)按鈕記錄一個新的堆狀態(tài)記錄。你可以創(chuàng)建多個堆狀態(tài)記錄。
5、 From heap state表中為要作為比較的初始狀態(tài),To heap state表中為要與From heap state作比較的狀態(tài)。每當(dāng)選中From heap state表中的記錄后,To heap state表中只能選擇該記錄之后的記錄。
6、 窗口的中間部分顯示了被比較堆狀態(tài)記錄之后新引用的資源。Count值是這個對象遞增引用的數(shù)量。可以單擊count表頭進(jìn)行排序。你可以選擇一個引用來查看堆狀態(tài)中所有與這個對象引用有關(guān)的對象引用。
7、 圖中的對象將有連接線或者邊界。從根節(jié)點(diǎn)開始,都有一個相應(yīng)的引用。把鼠標(biāo)移到節(jié)點(diǎn)上面,將會顯示新引用的數(shù)目和該節(jié)點(diǎn)調(diào)用toString()的。把鼠標(biāo)移到末級節(jié)點(diǎn)上,將會顯示這個引用的實(shí)例變量名。
8、 在圖的上方有兩個滾動條:
使用詳細(xì)程度滾動條來調(diào)節(jié)圖表顯示的詳細(xì)程度。
使用縮放滾動條來調(diào)節(jié)圖表顯示的大小。
所有不同的顏色代表不同的意思:
l 藍(lán)色節(jié)點(diǎn)為間接引用句柄。表示不是直接引用,而是引用的引用。
l 紅色節(jié)點(diǎn)為引用句柄。表示是直接引用。
l 節(jié)點(diǎn)的引用越多,顏色越深。
l 后續(xù)連接顯示為綠色線條。后續(xù)連接在引用中對于一個對象是更高層次的引用。所有的后續(xù)連接的邊框?yàn)樗{(lán)色。在引用層次中前續(xù)連接是后續(xù)連接的一個引用。
l 當(dāng)選擇一個節(jié)點(diǎn)以后,與這個節(jié)點(diǎn)相關(guān)的引用將會閃爍顯示。
l 選中一個節(jié)點(diǎn)然后單擊鼠標(biāo)右鍵,將會在一個新的實(shí)例中打開所選擇的節(jié)點(diǎn)。
使用CPU Profiler
內(nèi)存監(jiān)視器有助于對對象的最小化使用。CPU監(jiān)視器將有助于你了解對象所使用的時間。CPU監(jiān)視器在java虛擬機(jī)中可被看作是一個記錄設(shè)備。下面的步驟描述了如何給出被測試程序的響應(yīng)時間和CPU使用率。
1、 單擊CPU監(jiān)視按鈕切換到CPU監(jiān)視界面。
2、 單擊開始CPU 監(jiān)視按鈕開始記錄程序的CPU使用率。
3、 讓程序運(yùn)行一段時間(比如三秒以上)。
4、 單擊停止CPU監(jiān)視按鈕停止記錄。CPU監(jiān)視器顯示出了已經(jīng)記錄的CPU 使用信息。
5、 如果沒有選上,請選擇樹形格式,看到的信息是一樣的。
6、 單擊窗口上方的下拉框可以顯示出虛擬機(jī)當(dāng)前運(yùn)行所有的線程。
7、 選擇AWT-EventQueue-0
thread線程,該線程被AWT使用來處理時間,例如repaint事件。
8、 展開EventDispatchThread.pumpOneEvent()
行。
9、
單擊EventQueue.dispatchEvent()左方的加號展開所有的方法,直到展開到JComponent.paintWithBuffer()方法。行前面的圖標(biāo)所表示的意思為:
在這個例子中AWT-EventQueue-0線程一直用處理repaint事件。
10、
選擇JComponent.paintWithBuffer()行。如果鼠標(biāo)移到JComponent.paintWithBuffer()所調(diào)用的方法上,將顯示在JComponent.paintWithBuffer()中該方法所使用的時間比例。
11、
如果要分析那個線程是空閑的,CPU監(jiān)視器可以同時顯示CPU使用率和使用時間。單擊inspector(tool菜單下)打開inspector對話框。
12、
查看虛擬機(jī)信息不選中Ony record CPU usage,然后關(guān)閉窗口。使用這個特征來選擇緩沖策略,默認(rèn)顯示的是CPU純使用信息。
Optimizert提供了實(shí)時顯示與數(shù)據(jù)有關(guān)的高標(biāo)準(zhǔn)性能測試的信息。使用這個特點(diǎn),你可以了解到性能問題是和CPU有關(guān)還是和內(nèi)存有關(guān),或者與兩者都有關(guān)。
單擊
在這種模式下,顯示四類性能圖標(biāo),每類圖表描述了虛擬機(jī)不同的活動信息:
堆圖表:左上角的圖表中紅色線表示被測程序當(dāng)前需要的堆棧的大小,綠色表示被測程序?qū)嶋H使用的堆棧的大小。
垃圾收集圖表:有上角的圖中顯示當(dāng)前垃圾收集器的活動,顯示了垃圾收集時間占總時間的比例。有助于觀察垃圾收集器使用的頻率和時間。
線程圖:左下角的圖中紅色線表示當(dāng)前運(yùn)行的線程,綠色表示大多數(shù)的線程使用CPU。
類圖:右下角的圖顯示了虛擬機(jī)當(dāng)前加載的類的數(shù)目。
查看測試結(jié)果
Optinizeit包含了許多方法來查看測試結(jié)果,就象上面的實(shí)時監(jiān)控方法成功一樣,也可以把所有的信息保存在一個快照中或報(bào)告中,這樣你就可以在以后分析結(jié)果或者和另外一個結(jié)果進(jìn)行比較。
例如,你可以把測試結(jié)果輸出為一個html文件。
1、 當(dāng)演示程序還在運(yùn)行時,單擊CPU監(jiān)視器返回到CPU監(jiān)視界面。
2、 為了查看所有的信息,完全展開所有的方法。確認(rèn)你需要的信息都顯示在層次視圖中,因?yàn)檩敵鲋胁粫瑘D表。
3、 單擊輸出圖標(biāo)
4、 填寫標(biāo)題,檢查filename框中的路徑是有效的,并且選擇輸出為.html格式。
5、 單擊ok,Optimizeit會把結(jié)果輸出到定義的.html文件中,然后會自動打開。
現(xiàn)在你就可以共享你的測試結(jié)果了。
---------------------------------------------------------------------------------------------------------------------------------
說人之短,乃護(hù)己之短。夸己之長,乃忌人之長。皆由存心不厚,識量太狹耳。能去此弊,可以進(jìn)德,可以遠(yuǎn)怨。
http://www.aygfsteel.com/szhswl
------------------------------------------------------------------------------------------------------ ----------------- ---------