Optimizeit Thread Debugger概覽

來源:互聯網
上載者:User
debug Optimizeit Thread Debugger概覽本文通過介紹Optimizeit Thread Debugger的一些主要特徵來使你對它有個簡要的瞭解。如果想要瞭解更多的資訊,請查看Optimizeit Thread Debugger使用者手冊,也可以從Optimizeit Thread Debugger單擊主菜單info|help來查看所有的使用文檔。使用中有何問題,請隨時與Borland Technical Support聯絡。測試java程式Optimizeit Thread Debugger是從運行程式的虛擬機器中收集程式的覆蓋資訊的。首先要運行一個java程式,您需要安裝一個java虛擬機器。Optimizeit Thread Debugger預設安裝配置JDK 1.4 or 1.4.1。如果你想使用另外的虛擬機器,可以查看Optimizeit Thread Debugger使用者手冊的如何增加新的虛擬機器部分。從運行程式的虛擬機器中收集程式的覆蓋資訊的。首先要運行一個java程式,您需要安裝一個java虛擬機器。Optimizeit Thread Debugger預設安裝配置JDK 1.4 or 1.4.1。如果你想使用另外的虛擬機器,可以查看Optimizeit Thread Debugger使用者手冊的如何增加新的虛擬機器部分。啟動應用程式Optimizeit Thread Debugger可以測試任何類型的java程式,比如標準應用程式,應用小程式, servlets, JSPs, EJBs。本文所使用的測試程式包含在\doc\thread_debugger\quicktour目錄下。所有的測試都是在Optimizeit Thread Debugger中進行的:開啟Optimizeit Thread Debugge。如果你是第一次開啟,將會自動彈出編輯設定視窗。如果已經開啟,可以從file菜單下選擇new setting,調出編輯設定視窗。在程式類型框中選擇Application。單擊"Program main class or Jar file"右面的“Browse…”按鈕。找到\doc\thread_debugger\quicktour\ThreadDExample.class檔案,然後單擊open。Optimizeit Thread Debugger會返回到設定視窗,並且自動帶入程式的工作區和類路徑。在Source Path框中,單擊change…按鈕。在Source path chooser視窗中,選擇安裝路徑下的\doc\thread_debugger\quicktour目錄;選中後單擊視窗中的向下按鈕把它加入到source path部分。單擊ok增加到源檔案中路徑中。設定好後的對話方塊如下:選中Open a console選項;這是非常重要的,因為這個程式需要輸入一些命令來運行。 單擊Start now按鈕。編輯設定視窗會自動關閉, Optimizeit Thread Debugger會啟動被測程式。  查看線程Thread Debugger預設開啟的是線程監看式視窗。你也可以重新定義預設開啟的視窗來尋找程式在哪裡掛起了或者是比較耗時: 程式啟動後, Optimizeit Thread Debugger開啟了一個DOS視窗,在DOS視窗中輸入1,然後按斷行符號鍵開始第一輪測試。Thread Debugger視窗中會顯示當前啟動並執行線程和他們各自的運行狀態:整個過程中視窗中會使用不同的顏色條來顯示當前的線程運行狀態:運行狀態 (綠色)表示線程正在運行並使用CPU 。堵塞狀態 (黃色)表示該線程沒有運行,因為在進入monitor時發生了阻塞。等待狀態(紅色)表示線程正在等待monitor的通知與其他線程共用資源。等待輸入輸出狀態 (紫色)表示該線程的本地代碼沒有執行任何的過程。這常常是由於一個輸入/輸出操作操作引起的,但也有可能是其它情況導致給代碼沒有分配使用CPU而造成的。注意:當相應的線程狀態應該被更新而未更新時,Optimizeit會在顏色條中顯示一些點。當測試程式退出或沒有收集到資訊時,未知狀態的地區也將以不同類型的圖案來顯示。先選中主線程"main",然後單擊I/O-Waiting View 切換到等待I/O監看式視窗: 雙擊第三行,可以從原始碼視窗中看到發生等待的那行代碼。該程式基本上都使用了標準的輸入來方法。關閉源碼視窗並返回到線程活動監看式視窗。線上程視窗中也可以選取某一段來分析該時間內的一些資訊。返回到控制視窗並且輸入2,然後單擊斷行符號啟動第二輪測試(使用了小的串連)。Thread Debugger顯示了當前正在啟動並執行線程的狀態。你會看到在開始的某段時間內有10個線程在運行。 線上程活動監看式視窗,拖動捲軸到剛才的這段時間範圍內。如果不想繼續查看線程活動資訊,可以取消選中視窗右下方的Update continuously選項,這樣視窗中的資訊就不會隨時間變化了。 在這段時間內黃色地區表示相應的線程堵塞在一個monitor中。線上程條上直接單擊黃色條上任意一部分,並按住滑鼠左鍵向右移動。這樣就選中了該時間段: 選中時間段後:單擊Contention View 來分析為什麼線程在進入monitors時會發生阻塞。該資訊表示的僅是選擇時間段的。 單擊Waiting View 來研究線程在哪裡等待monitors。同樣,該資訊也僅僅是所選時間範圍的,所以應選擇圖中紅色條部分的地區。注意:如果線程已經退出或者已不存在該線程名在視窗中就會以斜體顯示。理解線程爭用在java多線程的應用程式中如果許多線程同時需要同樣的monitors(可譯為監視器或管程),就會造成嚴重的效能瓶頸。Monitors是被用來保護共用資源被多個線程同時調用的,每一個對象都有一個monitors,同時只允許一個線程持有monitors從而進行對對象的訪問,那些沒有獲得monitors的線程必須等待,直到持有monitors的線程釋放monitors。這部分被monitors保護起來的代碼,我們稱之為臨界區。為了最佳化效能,我們經常要儘可能地保持小的臨界區,特別是當臨界區在執行一些不耗用CPU資源的過程時。如果一個線程在臨界地區內由於等待輸入輸出而造成等待,它就不再使用CPU資源。然而,如果其他的線程也等待這個monitors的話就就不能充分利用CPU資源。下面我們用執行個體來說明這個問題:重新啟動被測試程式。程式啟動後,在DOS視窗中輸入1並按下斷行符號鍵啟動爭用較大的樣本。你會注意到在某段時間內有10個線程在運行。線上程視窗,拖動視窗下面的捲軸返回到這段時間,並且取消選中"Update continuously": 可以看到此例中相對於實際使用CPU的時間來說爭用monitor所花費的時間更長。為了更全面地瞭解這個情況,選中任何線程(例如線程7)並且單擊Contention View 切換到爭用查看視窗: 由於爭用ContentionExample$Consumer.run()方法100%的時間花在了堵塞上,爭用監視控制台上顯示了所有與該爭用有關的monitor。選中java.lang.Object monitor。爭用詳細說明控制台就會顯示列出所有與該爭用有關的線程,包括什麼時候發生了爭用。開啟第一個線程: 在ContentionExample$Consumer.run()行上雙擊就會彈出該方法的原始碼。在源碼視窗顯示線程7正在擷取monitor,然而源碼視窗下方顯示線程1同時也在擷取monitor: 在被monitor“lock”保護的臨界部分,此例中調用了方法processData()。該方法用1毫秒來類比輸入輸出。此例說明了使用過多的爭用會付出很大代價。對於使用幾毫秒cpu資源來說, 每個線程大概阻塞1秒。為了降低爭用的發生,當確認臨界區不再等待爭用時,有必要使臨界區最小化。我們的解決辦法很簡單,就是通過排除不需要同步處理的資料來處理縮小臨界區。這樣代碼調整為: synchronized (lock) {  a = dataSourceA.nextElement();  b = dataSourceB.nextElement();}processData(a, b);示範程式中也包含了測試useBigLock 標誌的情況。切換到線程監看式視窗。重啟被測程式,在DOS視窗中輸入2 後按下斷行符號鍵運行第二個測試。第二個測試也使用的同樣的代碼,但是這次useBigLock 標記被置為false。爭用時間降低到了每個線程只有幾毫秒。 這裡有一些技巧來防止由於爭用而引起的效能問題:盡量使臨界區最小。僅包含需要被保護的語句。鎖定可能最低的層級。在synchronized方法前加上explicit synchronized()語句。同步方法使用起來很方便,但是也可能導致過多的爭用,僅僅因為隨著時間的增長方法趨向於複雜化。 不要在臨界區執行一個I/O操作,除非唯一的目的是為了保護I/O描述符或者對象經常執行I/O操作。 猜測爭用的層級幾乎是不可能的。通過監視線程視窗,每次重大的變化都會看到有難以理解的爭用層級。 理解死結多線程的應用程式所面對的共同問題是,當一些線程由於不能獲得其所需的資源致使線程被掛起。死結對堆棧來說是極大的挑戰,因為它經常很少出現甚至不能複現。一個極少出現死結也有可能導致一個web應用程式長時間被掛起,並引起資源浪費。Optimizeit Thread Debugger提供了兩個強有力的特徵使調試死結變得容易。第一是給開發人員提供死結發生的位置。第二個特徵將在下一部分來說明,是協助開發人員來監視應用程式的運行,並且一旦有可能發生死結會及時給出提示。單擊Monitor View 按鈕切換到顯示執行臨界部區所有的線程和監視器的視窗。預設情況下該視窗的內容是即時顯示並每秒都更新的。 如果有必要,重啟被測試程式並在DOS視窗種輸入3然後斷行符號來運行一個死結的例子。這個死結是由於一個同步的參數錯誤引起的: 單擊圖中的任一個按鈕,相應的棧軌跡就會顯示在視窗的下方。可以雙擊某一行來查看相應的源碼。線程顏色所表示的狀態與線程視窗中所表示的一樣。一旦單擊串連圖中的一個按鈕,監視內容就不再更新。可以再次單擊該按鈕或者重新進入該視窗圖就可以繼續保持更新。監視程式的死結由於重現和理解死結是比較困難的,基於這種情況, Optimizeit Thread Debugger提供了一個線程分析器。當一個java程式運行時線程分析器記錄並監視所有的同步活動。然後搜尋任何一個有可能導致死結的類型並且給出一個警告或者錯誤資訊的列表,包含臨界區的詳細資料,諸如哪裡會有有可能發生死結和調用了那個線程。Optimizeit Thread Debugger會注意監視以下一些表現異常的鎖類型:鎖的順序:兩個線程直接或者連續地以不同的順序進入同一個monitors。鎖和等待:線程進入一個monitors然後等待進入其他的monitors。鎖和I/O等待:線程進入一個monitors然後停止執行任何的任務。除非兩個線程永遠不會同時運行,鎖的順序問題經常預示著有被鎖死的風險。對Lock-and-wait和Lock-and-I/O-wait類型的鎖,預示著情況比較正常,如果監視器的目的是限制對正在等待或者正在執行輸入輸出的資源的訪問。為了證實會發生死結,本文所指的樣本程式中會有3個線程會同時進入同一個監視器來擷取資料。每個線程都使用了隨機函數調用,這樣有時它們會以不同的順序進入監視器。這個程式僅僅用來示範,然而可以細想當多個線程在一個大的應用程式中運行並且當處理一些臨界區時以不同的順序進入監視器會發生什麼樣的情況。本例在執行過程中經常會發生死結,但是無論是否真正地發生死結Optimizeit Thread Debugger分析器都將彙報一些警告資訊和發生的錯誤資訊:如有必要請重新開啟樣本程式。 單擊Monitor Usage Analyzer 按鈕。單擊Record 開始記錄測試過程。在程式啟動後會彈出一個DOS視窗,在視窗中輸入4並按斷行符號鍵開始程式的運行。注意:分析器也可以通過選擇編輯設定視窗中的"start analyzer"選項來啟動。當以一定的順序發生阻塞時視窗中顯示符號 '>',以另外的順序發生阻塞時顯示符號'<'。最後,程式會停止,但是再不會出現菜單。這意味著發生了死結。按下斷行符號鍵可以重新顯示菜單: 再次單擊Record停止記錄。選擇第一條錯誤資訊並切換到分析視窗: 在方法名上單擊調出原始碼。關閉源碼視窗返回到監視器流量分析視窗。這裡有一些避免產生死結的技巧:儘可能讓鎖簡單。兩個線程使用一個monitors來共用資源不會發生死結,同樣他們永遠不會在臨界區期間發生阻塞。在進入monitors後不要執行輸入輸出操作,除非該監視器是用於保護輸入輸出的。當進入另一個monitors時不要等待另一個monitors,除非完全有必要並且是可理解的。總是以同樣的順序進入monitors。當持有一個鎖時不要調用公用的synchronized方法。活鎖過多在多線程的應用程式中另一類典型的問題是有過多的鎖。當虛擬機器被最佳化後,能夠非常快地進入多個monitors,減少monitors的使用就可以極大地提高效能。Optimizeit Profiler能夠用來度量每個方法使用了多長時間,包括進入monitors的時間,而Optimizeit Thread Debugger可使開發人員瞭解監視器使用的頻率和位置,無論爭用是否發生過:線上程視窗選擇一個線程或一個時間範圍後單擊Monitor Enter View 按鈕切換到進入monitors詳細資料查看視窗。例如,在選擇main類後單擊出現如下所示的視窗:可以看到main類進入了22個monitor。 本文只是Optimizeit Thread Debugger的一個概覽。如果想要瞭解更多有關Optimizeit的資訊,請查看Optimizeit Thread Debugger使用者指南。 翻譯:wyingquan@hotmail.com  時間:2004-11-11如果您對本文或白盒測試感興趣,請登入http://groups.yahoo.com/group/WhiteBoxTestCN/,加入會員,即可下載到本文完整的內容(格式為呆圖片的word文檔),在這裡還有其他一些白盒測試載入器的介紹與相關討論。 

相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。