NetBeans IDE 6.0 包含一個強大的性能分析工具,可提供與應用程序運行時行為有關的重要信息。通過 NetBeans 性能分析工具,我們可以方便地在 IDE 中監控應用程序的線程狀態、CPU 性能以及內存使用情況,而且產生的開銷相對較少。
本文將概述 IDE 中包含的性能分析工具,並指導您快速開始分析 NetBeans 項目的性能。本文旨在演示 IDE 中可用的各種性能分析任務以及分析項目性能時可以獲得的分析結果。但並不覆蓋 IDE 中包含的所有性能分析功能,也不會深入探索如何研究性能分析結果以解決應用程序中存在的特定執行問題。
在本文檔中,我們將使用性能分析工具獲得有關 Anagram Game 示例應用程序的性能分析數據,該應用程序是 IDE 提供的一個簡單 Java 應用程序。盡管 Anagram Game 是一個非常簡單的 Java 應用程序項目,但是當您分析更大、更復雜的 Java 應用程序以及 Web 和企業應用程序項目時,仍然需要遵循同樣的步驟。
本文檔將演示如何使用 IDE 來分析應用程序並獲得以下分析結果:
應用程序的運行時行為
應用程序方法占用的 CPU 時間
對象創建
另外,本文檔還將演示如何創建分析結果快照,並比較分析結果。
前提條件
本文檔假定您擁有以下技術的基本知識或者具備相關編程經驗:
Java 編程
NetBeans IDE
本教程所需要的軟件
要使用本教程,您需要在計算機上安裝以下軟件:
NetBeans IDE 6.0(下載)。
Java Standard Development Kit (JDK) 5.0 版或 6.0 版(下載)
NetBeans IDE 綁定了本性能分析工具,因此不需要任何特殊步驟就可以開始分析應用程序的性能。
初次分析性能
第一次使用性能分析工具時,IDE 需要執行一些初始化操作,以確保可以獲得精確的分析結果並將該工具和項目集成在一起。為展示這一點,我們首先將創建 AnagramGame 項目,然後運行校准。第一次分析 AnagramGame 項目的性能時,IDE 將會自動執行集成。
創建示例項目
在本文檔中,我們將分析 Anagram Game 示例應用程序的性能。為了完成此任務,首先使用 New Project 向導創建該示例應用程序。
要創建 Anagram Game 應用程序,請執行以下步驟:
從主菜單選擇 File > New Project 選項。
在 New Projects 向導中,選擇 Samples > Java 類別。
選擇 Anagram Game 項目。
指定項目位置並確保選中 Set as Main Project 屬性。單擊 Save 按鈕。
單擊 Finish 按鈕,IDE 將創建一個 Anagram Game 示例項目。您將可以在 Projects 窗口看到 Anagram Game 項目,並且該名稱顯示為粗體,表示該項目被設為主項目。默認情況下,使用 IDE 分析項目性能時,IDE 將分析主項目的性能。
初次使用性能分析器
為了獲得精確的分析結果,我們必須擁有用於性能分析的每個 Java 平台的校准數據。如果是第一次運行性能分析工具,或者無法獲得該 Java 平台的有效校准數據,系統會提示為您的平台運行校准進程。
校准只需要執行一次。但是,如果您對機器的配置進行了任何可能影響其性能的重大更改,則需要再次運行校准。您可以通過執行以下步驟在任何時候運行校准:
選擇 Profiler > Advanced Commands > Run Profiler Calibration 選項。
選擇 Java Platform 選項。單擊 OK 按鈕。
校准操作完成後,會出現一個對話框,顯示有關校准結果的信息。每個 Java 平台的校准數據保存在主目錄中的 .nbprofile 目錄中。
初次分析項目性能
第一次分析項目的性能時,您將會看到一個對話框,提示 IDE 需要將性能分析工具和目標項目集成。為了與項目集成,IDE 會修改項目的構建腳本,為所需的性能分析庫導入一個其他的構建腳本。在修改構建腳本之前,IDE 會創建一個原構建腳本的備份。
要和項目集成性能分析工具,在對話框中單擊 OK 按鈕。IDE 將創建一個 build.xml 的備份,其名稱為 build-before-profiler.xml,並將以下行添加到 build.xml 中:
<import file="nbproject/profiler-build-impl.xml"/>
您可以通過從主菜單中選擇 Profiler > Advanced Commands > Unintegrate 選項來恢復原構建腳本。
選擇性能分析任務
IDE 提供了很多內部設置,我們可以根據自己的需要來調整性能分析。例如,您可以通過減少生成信息的總量來降低性能分析的開銷。但是,您可能需要一些時間才能理解眾多可用設置的意義和用法。對於很多應用程序,為性能分析任務指定的默認設置在大多數情況下已經夠用了。
對項目進行性能分析時,根據您想要獲得的分析信息的類型,使用 Select Profiling Task 對話框選擇任務。下表說明了性能分析任務以及從運行該任務獲得的分析結果。
性能分析任務 結果 監控應用程序 選擇此任務以獲得有關目標 JVM 屬性的高級信息,包括線程活動和內存分配。 分析 CPU 性能 選擇此任務以獲得有關應用程序執行的詳細信息,包括執行方法的時間和方法被調用的次數。 分析內存使用情況 選擇此任務以獲得有關對象分配和垃圾回收的詳細信息。Select Profiling Task 對話框是運行性能分析任務的主界面。選擇任務後,您可以修改任務設置以進一步調節您將獲得的結果。對於每個性能分析任務,您也可以根據該任務創建並保存自定義性能分析任務。您創建自定義性能分析任務時,該自定義任務會在顯示在 Select Profiling Task 對話框的列表中,便於以後輕松查找和運行您的自定義設置。您創建自定義性能分析任務後,您可以通過單擊 Select Profiling Task 對話框中的 Advanced settings 選項來修改更多高級分析設置。
現在,我們將分析 Anagram Game 的性能並展示每個性能分析任務。
監控應用程序
當您選擇 Monitor 任務時,不需要任何工具就可以啟動目標應用程序。監控應用程序時,您將獲取有關目標 JVM 的許多重要屬性的高級信息。由於監控應用程序開銷很小,因此可以在此模式下長時間運行應用程序。
要監控 Anagram Game 應用程序,請執行以下步驟:
確保將 AnagramGame 設置為主項目。
從主菜單選擇 Profile > Profile Main Project 選項。
在 Select Profiling Task 對話框中選擇 Monitor 選項。
單擊 Run 按鈕。
單擊 Run 按鈕後,IDE 會啟動應用程序,並且 Profiler 窗口會在 IDE 的左窗格打開。Profiler 窗口包含一些控制器,我們可以執行以下操作:
控制性能分析任務
查看當前性能分析任務的狀態
顯示分析結果
管理分析結果快照
查看基本遙測統計數據
您可以使用 Profiler 窗口中的控制器或主菜單來打開可以在其中查看監控數據的窗口。您可以使用 Telemetry Overview 窗口快速實時獲得監控數據的概覽。
依次選擇 Window > Profiling > Telemetry Overview 選項,在 Output 窗口中打開概覽。
您可以在任何分析會話期間隨時打開 Telemetry Overview 窗口並查看監控數據。
Telemetry Overview 可用於快速查看應用程序的狀態。將光標置於某個圖表之上,我們可以看到有關圖表中顯示的數據的更多詳細統計數據。您可以單擊 Telemetry Overview 窗口中的任何圖表,以打開更大、有更多詳細信息的圖表。
分析 CPU 性能
當您選擇 CPU 任務時,IDE 會對應用程序的的方法級的 CPU 性能(執行時間)進行分析,並實時處理結果。您可以選擇分析整個應用程序的性能,或者只分析部分應用程序代碼,甚至只分析某個特定代碼片段。
要分析 CPU 性能,您可以通過選擇以下選項之一確定如何分析應用程序:
Entire Application。在這種模式下,分析應用程序的所有方法都要被監測。當線程進入和退出項目方法時 IDE 會進行記錄,使您可以查看每個方法花費了多少時間。
Part of Application。在這種模式下,您可以監測並分析應用程序代碼的有限子集。這可以大大降低分析的開銷。
要對應用程序的一部分進行性能分析,首先需要指定一個或多個根方法。根方法是在源代碼中指定為 Instrumentation 根的方法、類或包。當應用程序的一個線程進入和離開 Instrumentation 根時,系統針收集分析數據。在應用程序的線程進入根方法之前,不會收集任何分析數據。
注意:對於一些程序,此選項可能是獲得任何詳細和/或真實性能數據的唯一方法,因為分析整個應用程序可能會生成太多分析數據,以至於應用程序變得無法使用或者可能甚至引起崩潰。
您也可以通過使用過濾器限制監測的源代碼,進一步微調分析多少代碼。
現在您可以使用 IDE 來分析 Anagram Game 應用程序的 CPU 性能了。您將選擇 Part of Application 選項,然後選擇 WordLibrary.java 為分析根。通過選擇此類為分析根,可以將分析限制在此類中的方法。
通過單擊 Profiler 窗口中的 Stop 按鈕停止先前的分析會話(如果仍然在運行)。
從主菜單選擇 Profile > Profile Main Project 選項。
在 Select Profiling Task 對話框中選擇 CPU 選項。
選擇 Part of Application 選項。
要使用此選項,您也需要指定分析根方法。
單擊 define 按鈕打開 Specify Root Methods 對話框。
單擊 Add From Project 按鈕打開 Select Root Methods 對話框。
在 Select Root Methods 對話框中,展開 AnagramGame 節點並選擇 Sources/com/toy/anagrams/lib/WordLibrary。單擊 OK 按鈕。
單擊 Specify Root Methods 對話框中的 OK 按鈕。
您可以看到 WordLibrary 被列為根方法。
在 Select Profiling Task 框中,您可以看到一個根方法被指定為分析根。當分析項目時,您可以指定多個根方法。您也可以單擊 edit 按鈕來修改所選根方法。
選擇 Profile only project classes 選項作為 Filter 字段的值。
該過濾器使您可以限制被監測的類,在本例中限制到項目中找到的類。您可以單擊 Show filter value 按鈕來查看過濾類的列表。您可以從 IDE 的預定義分析過濾器中選擇或者創建自己的自定義過濾器。
在 Select Profiling Task 對話框中單擊 Run 按鈕。
單擊 Run 按鈕後,IDE 會啟動應用程序並開始分析會話。要查看分析結果,單擊 Profiler 窗口中的 Live Results 按鈕來打開 Live Profiling Results 窗口。Live Profiling Results 窗口會顯示迄今為止收集到的分析數據。默認情況下顯示的數據每隔幾秒鐘就會刷新一次。當分析 CPU 性能時,Live Profiling Results 窗口會顯示有關每個方法花費的時間以及每個方法的調用次數的信息。您可以看到在我們的 Anagram Game 應用程序中最初僅有兩個方法被調用。
如果您嘗試解開 Anagram Game 中的一些字謎,您可以看到 IDE 會顯示我們的操作正在調用的其他方法以及應用程序在每個方法上花費的時間。
通過右鍵單擊方法的名稱並選擇 Go To Source,您可以快速浏覽到包含任何列出的方法的源代碼。單擊 Go To Source 按鈕時,該類會在 Source 編輯器中打開。
分析內存使用情況
分析內存使用情況任務會給您提供有關在目標應用程序中被分配的對象的數據,比如被分配對象的數目、類型和位置。
要分析內存性能,您可以通過選擇以下選項之一確定想要獲取多少數據:
Record object creation only。當選擇此選項時,當前由目標 JVM 加載的所有類(以及實際加載的每個新類)都會被監測,以生成有關對象分配的信息。
Record both object creation and garbage collection。當選擇此選項時,分析應用程序會給您提供有關對象活躍度的信息,比如有關每個類型的對象由多少仍然是活動的、它們的大小和平均年齡以及分配數據。
第一個選項是第二個的功能子集,並且具有更小的性能和內存開銷。Select Profiling Tasks 窗口中的 Overhead 測量儀可以根據您選擇的分析選項大致給出分析開銷的增長或降低。
現在我們可以使用 IDE 來分析 Anagram Game 應用程序的內存性能了。您將選擇 Record both object creation and garbage collection 選項。您也將選擇 Record stack traces for allocation,這樣 IDE 會記錄整個調用堆棧。通過選擇此選項,當您創建內存快照時,您將可以查看分配了對象的方法調用的相反的調用樹。
單擊 Profiler 窗口中的 Stop 按鈕停止先前的分析會話(如果仍然在運行)。
單擊 Stop 按鈕時,Anagram Game 應用程序也會停止。
從主菜單選擇 Profile > Profile Main Project 選項。
在 Select Profiling Task 對話框中選擇 Memory 選項。
選擇 Record both object creation and garbage collection 選項。
Track every N object allocations 的值仍保持為默認值 10。
此選項設置了堆棧取樣的時間間隔/ 比例。通過將該值設為 10,則表示對於每個類,每隔 10 個對象才有一個將被完整記錄。要記錄每個對象的所有信息,您可以將該值設置為 1.但是這將顯著增加分析開銷。
選擇 Record stack traces for allocation 選項。
請注意,當您選擇此選項時,Overhead 測量儀會顯著增加,但是我們的應用程序足夠小,應該可以管理其性能高峰。
單擊 Run 按鈕。
單擊 Run 按鈕後,IDE 會啟動應用程序並開始分析會話。要查看分析結果,單擊 Profiler 窗口中的 Live Results 按鈕來打開 Live Profiling Results 窗口。Live Profiling Results 窗口顯示有關分配到項目中的對象的大小和數量的信息。
默認情況下,結果會按 Live Bytes 的大小來存儲和顯示,但是您可以單擊列標題來更改結果顯示的方式。您也可以通過在列表下面的過濾器框中鍵入一個類名來過濾結果。
創建快照
當正在進行分析會話時,您可以通過創建快照來捕獲分析結果。快照可以捕獲您創建該快照時的分析數據。但是,快照與活動的分析結果在以下方面也有所不同:
當無分析會話運行時,可以對快照進行分析。
快照比活動的結果包含更詳細的分析數據記錄。
快照更容易比較(內存快照)。
由於打開項目的快照並不一定需要分析會話正在運行,因此您可以通過在 Profiler 窗口中選擇已保存快照列表中的快照,並單擊 Open 隨時打開項目的快照。
創建和比較內存快照
對於 Anagram Game 應用程序,我們想要創建結果的快照,並查看 String 類型對象的分配堆棧軌跡。然後我們想要再創建一個快照,並對兩個快照進行比較。如果打開了內存快照,您可以將其與項目中或在系統的其他地方保存的內存快照進行比較。
確保分析會話仍在運行。
(如果您停止了分析會話,請重復以上步驟,以分析內存性能並打開 Live Profiling Results 窗口。)
右鍵單擊 Profiling Results 窗口中包含 java.lang.String 的行,並選擇 Take Snapshot and Show Allocation Stack Traces。
IDE 創建內存快照並在 Allocation Stack Traces 選項卡上將其打開,您可以在該選項卡上浏覽呈現此對象的方法的反調用樹。
單擊快照工具欄上的 Save Snapshot to Project 按鈕(或者 Ctrl+S),將該內存快照保存到項目中。當您將快照保存到項目中時,該快照被添加到 Anagram Game 的 Profiler 窗口中的已保存快照列表中。默認情況下,快照實際上被保存在項目的 nbproject/private/profiler 目錄。已保存快照的後綴為 .nps。
注意:您可以將快照保存到文件系統上的任何地方,但是只有保存在項目中默認位置的快照會在 Profiler 窗口中列出。您也可以將快照保存為圖像文件 (.png),這些圖像文件可以在 IDE 的外面查看。
通過單擊 Live Profiling Results 工具欄上的 Take Snapshot of Collected Results 按鈕創建其他快照(或者單擊 Profiler 窗口中的 Take Snapshot 按鈕)。保存快照。
在其中一個內存快照的窗口中,單擊快照工具欄上的 Compute Difference 按鈕()。
選擇 Select Snapshot to Compare 對話框中的第二個內存快照並單擊 OK 按鈕。
Liveness Comparison 窗口即打開,顯示兩個內存快照之間的不同。
更多信息
使用 NetBeans IDE 6.0 對應用程序進行性能分析的介紹到此結束。本文檔展示了如何使用 IDE 對一個簡單的 NetBeans 項目進行性能分析並查看分析結果。本文介紹的步驟適用於分析大多數項目。分析更加復雜的項目(比如企業應用程序和形式自由的項目)可能需要其他配置步驟。