• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            人生亦編程

            --Programmable Life
            posts - 86, comments - 43, trackbacks - 0, articles - 7

            關于代碼效率

            Posted on 2006-08-31 08:42 人生亦編程 閱讀(548) 評論(0)  編輯 收藏 引用 所屬分類: 程序
            有個叫profiler的工具,是用來檢測代碼效率的,現轉用法如下,用得著的時候再去學它。

            NetBeans IDE 4.1/5.0 Profiler 教程

            本文旨在介紹配合使用 NetBeans Profiler v5.0 或 Profiler Milestone 8 的內容。如果您使用的是 Milestone 5,請使用此版本。如果您使用的是 Milestone 6,請使用此版本。

            預計持續時間:50 分鐘

            NetBeans Profiler 是一個功能強大的工具,它提供了有關應用程序運行時行為的重要信息。NetBeans Profiler 產生的開銷相對來說較小,它可以跟蹤線程狀態、CPU 性能和內存使用情況。本教程將向您介紹如何使用 NetBeans Profiler 來完成以下操作:

            • 監視應用程序的運行時行為,其中包括:
              • 堆內存大小
              • 垃圾回收統計信息
              • 線程計數
              • 線程狀態:運行、休眠、等待、受阻
            • 確定應用程序方法使用的 CPU 時間
            • 監視應用程序創建對象的過程

            先決條件

            本教程假定您已經具有了一些基本的 Java 編程和 NetBeans IDE 使用經驗。

            教程所需的軟件:

            • 下載并安裝 Java 2 Platform Standard Edition v5.0, Update 4(或更高版本)。請注意,NetBeans IDE 需要完整的 JDK,而不僅僅是 JRE。請記錄此安裝目錄。
            • 下載并安裝 NetBeans IDE v4.1 或 v5.0。請記錄此安裝目錄。當系統提示您選擇 JDK 時,請指定 v5.0, Update 4(或更高版本的)JDK。
            • 下載并安裝用于 NetBeans IDE v5.0 的 NetBeans Profiler v5.0。如果使用的是 NetBeans IDE 4.1,請下載 Milestone 8。
              Profiler 安裝程序會要求您修改 NetBeans IDE 安裝;請指定用于 NetBeans IDE 的安裝目錄。
              注意:Profiler v5.0 只能與 NetBeans IDE v5.0 一起使用;而 Profiler Milestone 8 只能與 NetBeans IDE v4.1 一起使用。
            • 下載教程 zip 文件,其中包括練習中使用的項目。

            本文使用的表示法

            • <NETBEANS_HOME> - NetBeans IDE 安裝目錄
            • <USER_HOME> - 用戶的 home 目錄
            • <tutorial_root> - 解壓縮教程 zip 文件所在的目錄
              • 本文使用 <tutorial_root> 來表示解壓縮此教程的 zip 文件所在的目錄。此教程的 zip 文件的名稱為 profilertutorial.zip
              • 將教程 zip 文件解壓縮到 <tutorial_root> 目錄時,系統會創建一個名為 netbeansprofiler 的子目錄。例如,在 Windows 操作系統中,如果已將教程 zip 文件解壓縮到驅動器 E:\ 的根目錄中,則系統會創建 E:\netbeansprofiler 子目錄。在 Solaris/Linux 操作系統中,如果已將教程 zip 文件解壓縮到 /home/username 目錄中,則系統會創建 /home/username/netbeansprofiler 子目錄。

            教程練習

            參考資源:



            練習 0:安裝并配置教程環境

            在開始學習教程之前,請先檢查以下內容:

            1. 啟動 NetBeans IDE,并確認 IDE 已打開。通過選擇“性能分析”>“幫助”>“關于性能分析器...”,驗證安是否裝了 NetBeans Profiler。
              • 在 Windows 操作系統中,雙擊 NetBeans IDE 圖標
              • 在 Solaris/Linux 操作系統中,打開終端窗口,然后鍵入 <NETBEANS_HOME>/bin/netbeans
            2. 僅限 NetBeans IDE v4.1:安裝所需的修補程序。
              1. 從“工具”菜單中選擇“更新中心”,以訪問 NetBeans 更新中心。
              2. 確保選中了“NetBeans 修補程序更新中心”,然后單擊“下一步”按鈕。建立連接后,將顯示一個更新列表。
              3. 在“NetBeans 修補程序更新中心”條目下,選擇“NetBeans Profiler(J2EE 項目 - Tomcat5 支持)”。該操作還將自動選擇 "Tomcat 5 Server" 條目。
              4. 單擊“下一步”按鈕,并按照說明進行操作以便 IDE 可以安裝這些修補程序。




            練習 1:監視 Swing 應用程序中的線程狀態(15 分鐘)

            本練習的學習目的:

            在本練習中,您將學習如何使用 NetBeans Profiler 監視 J2SE 應用程序中的線程狀態。這樣,您就可以診斷樣例應用程序中的性能問題。

            背景信息:

            Swing 庫為 J2SE 應用程序提供了圖形用戶界面組件。Swing 庫會使用到多個線程,利用 NetBeans Profiler 這一功能強大的工具,您可以分析出每個線程所花費的處理時間,從而利用這些分析信息來解決性能問題。

            執行步驟:

            1. 選擇“文件”>“打開項目”。找到 <tutorial_root>/netbeansprofiler/exercises 文件夾。選擇 exercise1 文件夾,然后單擊“打開項目文件夾”按鈕。
            2. 在“項目”窗口中,右鍵單擊 exercise1 條目并選擇“清理并生成項目”。然后,再次右鍵單擊 exercise1 條目并選擇“運行項目”。此時,將顯示該程序的窗口,如下所示。

              查看應用程序的窗口

            3. 將 "Seconds Before Notification" 設置為 30。
            4. 單擊 "Start!" 按鈕。請注意,該程序無法正確地刷新屏幕。
            5. 單擊 "Exit" 按鈕。請注意,該程序根本不會作出響應。
            6. 將另一個窗口放在該窗口的某一部分上,以遮擋該窗口的視圖。當移開另一個窗口時,您會注意到樣例應用程序沒有相應地刷新其窗口。如下面的示例所示。


            7. 30 秒后,最終將顯示一個消息框,如下所示。單擊消息框上的 "OK" 按鈕。


            8. 應用程序窗口將再次開始響應。單擊 "Exit" 按鈕將其關閉。
            9. 選擇“性能分析”>“分析主項目”。
            10. 如果出現一個對話框,詢問您是否允許修改項目生成腳本,請單擊“確定”。如下面的示例所示。


            11. 此時會顯示“選擇性能分析任務”對話框。單擊占據較大區域的“監視應用程序”按鈕。
            12. 應選中“啟用線程監視”復選框。
            13. 單擊“運行”按鈕。如果顯示一個對話框,指示您必須先收集 Profiler 的校準信息,請單擊“確定”按鈕。如下面的示例所示。

              選擇“性能分析”>“高級命令”>“運行性能分析器校準”。完成校準后,Profiler 會顯示一個對話框,請單擊“確定”按鈕。如下面的示例所示。

              要進行性能分析,請返回至上面的第 9 步。

            14. 完成上述步驟后,將啟動該應用程序,并且 IDE 會顯示“性能分析器”控制面板,如下所示。


            15. 性能分析器將在其主窗口中顯示線程狀態,如下面的示例所示。


              它使用顏色編碼來顯示線程狀態。

              • 綠色:線程正在運行或準備運行。
              • 紫色:線程正在調用 Thread.sleep(),處于休眠狀態。
              • 黃色:線程正在調用 Object.wait(),處于等待狀態。
              • 紅色:線程在嘗試訪問同步的塊或方法時受阻。

            16. 找到樣例 Swing 應用程序的窗口(NetBeans IDE 窗口可能在其上面)。單擊樣例應用程序中的 "Start!" 按鈕,同時監視標記為 AWT-EventQueue-0 的線程所發生的變化。它將變為綠色并持續這種狀態整整 30 秒鐘,如以下樣例所示。

              此圖形顯示了應用程序沒有響應的原因。標記為 AWT-EventQueue-0 的線程是 Swing 用來處理窗口事件的事件分發線程 (Event Dispatch Thread, EDT)。在正常運行的 Swing 應用程序中,EDT 的大部分時間處于等待狀態而運行的時間卻很少,因為它只有在分發事件時才會運行很短的一段時間。但是,如果應用程序中的事件處理程序未立即返回,則程序將停止響應,就像在此示例中一樣。

            17. 30 秒后,屏幕將顯示應用程序的消息框。找到該消息框(NetBeans IDE 窗口可能在其上面)并單擊 "OK" 按鈕。然后,單擊樣例應用程序的 "Exit" 按鈕,將其關閉。
            18. “項目”窗口與“性能分析器”控制面板共享同一個空間;單擊“項目”標簽將會顯示“項目”窗口。
            19. 在“項目”窗口中,雙擊 exercise1 條目以將其展開,然后展開“源包”和 profilingthreads 條目。右鍵單擊 DisplayForm.java 條目并選擇“打開”。
            20. 在包含 DisplayForm.java 的編輯器窗口中,取消第 132 行至第 157 行的代碼塊注釋。提示:如果未將編輯器配置為顯示行號,請選擇“視圖”>“顯示行號”。
            21. 在包含 DisplayForm.java 的編輯器窗口中,取消(或注釋掉)第 122 行到第 128 行的代碼塊注釋。下圖突出顯示了取消注釋的代碼塊。


            22. 選擇“文件”>“保存”。您剛才刪除了未正確使用 EDT 的代碼,并利用了更穩定可靠的解決方案來替代它?,F在,應用程序可以及時地作出響應。
            23. 選擇“生成”>“生成主項目”(或按 F11 鍵)。
            24. 選擇“性能分析”>“分析主項目”。
            25. 將顯示“選擇性能分析任務”對話框。單擊占據較大區域的“監視應用程序”按鈕。
            26. 確保選中了“啟用線程監視”。
            27. 單擊“運行”按鈕。
            28. 在顯示樣例程序時,單擊 "Start!" 按鈕。請注意,此時的性能分析線程圖已經發生了變化,如以下示例所示。

              EDT 為黃色,應用程序創建的名為 "Our SwingWorker #1" 的線程為綠色。由于 EDT 不是用來執行耗時任務的,因此,按鈕和其他程序控件仍保持響應的狀態。

            29. 在樣例程序中單擊 "Exit"。
            30. 右鍵單擊 Profiler 圖形中的 AWT-EventQueue-0 線程,然后選擇“線程詳細信息”。Profiler 會顯示一個餅圖,表明了每種狀態所花的時間;如以下示例所示。

              該圖形可以幫助您判斷程序在每個線程中所花費的時間是否恰當。上述示例是代碼修復后的示例,因此,它顯示了 EDT 在大部分時間中都處于等待狀態的情形,這正好是該線程應具有的行為。

            31. 在“項目”窗口中,右鍵單擊 exercise1 條目,然后選擇“關閉項目”。

            小結:

            在本練習中,您學習了如何使用 Profiler 來啟動應用程序,以及如何解釋 Profiler 的線程信息圖形,以此來跟蹤 Swing 應用程序中的性能問題。

            返回頁首



            練習 2:確定某個方法使用的 CPU 時間(15 分鐘)

            本練習的學習目的:

            在本練習中,您將學習如何使用 Profiler 來確定某個應用程序的方法所花費的時間。

            背景信息:

            CPU 的性能問題通常與應用程序的特定功能有關。例如,在報告系統中,某個報告的運行速度可能比其他報告慢。只分析應用程序中出現性能問題的部分,可以大大減少性能分析器產生的開銷。在本練習中,您將使用 NetBeans Profiler 來檢查 Web 應用程序中 CPU 的使用情況。在練習 3 中,我們仍然使用該樣例 Web 應用程序來說明如何通過 Profiler 查找內存泄漏。

            執行步驟:

            1. 選擇“文件”>“打開項目”。找到 <tutorial_root>/netbeansprofiler/exercises 文件夾。選擇 exercise2 文件夾,并確保選中“作為主項目打開”。單擊“打開項目文件夾”按鈕。
            2. 在“項目”窗口中,單擊 exercise2 條目,然后從菜單中選擇“生成”>“清理并生成主項目”。
            3. 從菜單中選擇“性能分析”>“分析主項目”。如果出現一個對話框,詢問您是否允許修改項目生成腳本,請單擊“確定”。
            4. 將顯示“選擇性能分析任務”對話框。
            5. 單擊“分析性能”按鈕。
            6. 選擇“部分應用程序”單選按鈕。然后,單擊位于“部分應用程序”單選按鈕旁邊的“選擇”按鈕。此時將顯示“指定根方法”窗口。

              注意:下面的三個步驟僅適用于 Milestone 8。

            7. 在“指定根方法”窗口中,單擊“從項目添加...”按鈕以添加要分析的根方法。將會顯示“選擇方法”窗口。
            8. 在“選擇方法”窗口中,單擊“選擇”按鈕。Profiler 將顯示“選擇類”窗口。
            9. 在“類名”文本字段中輸入 Per。等待 IDE 為您顯示適用的類列表。選擇 Performance 類。單擊“打開”按鈕以打開其方法列表。

              注意:下面的兩個步驟只適用于 Profiler v5.0。

            10. 在“指定根方法”窗口中,單擊“從項目添加...”按鈕以添加要分析的根方法。將會顯示“選擇方法”窗口。
            11. 在“類名”文本字段中,鍵入 demo.Performance,然后按 Enter 鍵。

              查看“選擇方法”對話框

            12. 在根方法列表中單擊 processRequest 方法以將其選中,然后單擊“確定”按鈕。您剛才已將 demo.Performance.processRequest 選中為性能分析的根方法。這意味著,性能分析器將分析 demo.Performance.processRequest 方法和它調用的所有方法,以及這些方法又調用的所有方法,依此類推。性能分析器將從 demo.Performance.processRequest 開始,通過分析方法調用圖形來確定哪些方法需要分析。它將只分析那些需要分析的方法,應用程序的其余部分將在沒有任何性能分析開銷的情況下繼續以最快的速度運行。
            13. 在“指定根方法”窗口中單擊“確定”按鈕。
            14. 在“分析性能”窗口中,從過濾器列表中選擇“快速過濾器”,然后單擊位于“快速過濾器”條目旁邊的 "..." 按鈕以指定進行分析的方法。將顯示“設置快速過濾器”窗口。驗證是否已選中了“排除”單選按鈕。然后,在“過濾器值”文本字段中輸入 org.apache 并單擊“確定”按鈕。這樣,性能分析器將不分析所有 org.apache 包(及其子包)中的方法,即使這些方法被選定的根方法調用也是如此。這會減少性能分析的開銷,并過濾掉無關的信息。

              “設置快速過濾器”對話框

            15. 在“選擇性能分析任務”窗口中,單擊“運行”按鈕。如果出現一個對話框,要求您提供校準信息,請單擊“確定”按鈕;在性能分析器顯示的對話框說明校準已完成后,請單擊該對話框的“確定”按鈕。
            16. IDE 將啟動 Tomcat,并在 Web 瀏覽器窗口中顯示 Web 應用程序的 index.jsp 頁。同時,將在后臺運行性能分析器。注意:缺省情況下,將在成為焦點的瀏覽器窗口中顯示 index.jsp 頁;您可能需要打開另一個瀏覽器窗口,以便在運行 Web 應用程序時可以閱讀這些說明。
            17. 因為已選擇了 demo.Performance.processRequest 作為根方法,所以,您需要使用導致該根方法運行的 Web 應用程序部分:在 Web 瀏覽器中,單擊“性能問題”以轉至“性能”演示頁。在“性能”演示頁上的輸入文本字段中輸入 123456。請不要選中“已優化”選項。單擊“提交查詢”按鈕,計算小于或等于 123456 的最大素數。
            18. 需要幾秒鐘的時間才能出現響應,這是因為計算最大素數的算法存在一些性能問題,同時,在監視 processRequest 方法的性能時,性能分析器也會產生一些開銷。
            19. 當瀏覽器中顯示 "123449" 結果后,請單擊 “獲取結果”按鈕 按鈕,或者選擇“性能分析”>“生成收集結果的快照”。單擊位于 CPU 使用情況快照底部的“組合”標簽。性能分析器將顯示最新的性能結果,如下所示。

              查看性能結果。

              頂部窗口顯示了從根方法開始的完整方法調用圖形。底部窗口是重點描述的部分;它顯示了應用程序中的熱點,即執行時間最長的那些方法。

            20. 要查看并解釋這些結果,請注意 processRequest 方法總共運行的時間為 4308 毫秒 (ms)。然而您會發現,運行 processRequest 方法本身的指令只花費了很少的時間,processRequest 的“自用時間”僅為 10.1 毫秒。絕大部分時間花在了 processRequest 調用的其他方法上。底部窗口中顯示的熱點是按“自用時間”進行排序的。通過查看該列表,您可以看到 calculate 方法占用了 97.8% 的執行時間??紤]到為 calculate 方法分配的工作量,這就不足為奇了。
            21. 為了幫助您確定如何優化應用程序,NetBeans Profiler 可以識別代碼中無法預料的瓶頸,或者識別妨礙應用程序隨意縮放的瓶頸。單擊熱點列表中的 calculate 條目以了解時間究竟花在什么地方,這會更新調用圖形窗口以顯示 calculate。因為 calculate 方法不調用任何其他方法,所以請右鍵單擊 calculate 條目,然后選擇“轉至源代碼”以便檢查源代碼。您會發現它使用了效率很低的算法,所以應該重新設計這種算法。
            22. 選擇“性能分析”>“重置收集的結果”以清除性能分析器的緩沖區。要將 calculate 的運行時與優化的算法 calculate2 作比較,請在 Web 瀏覽器中選中“已優化”選項,然后單擊“提交查詢”。等待顯示結果,然后重新選擇“性能分析”>“生成收集結果的快照”。請注意,processRequest 方法只運行了 107 毫秒,而 calculate2 方法所花的時間還不到執行時間的 10%!

              查看性能結果。


            23. 注意:我們將繼續在本練習的基礎上進行下面的練習,因此,請不要關閉任何窗口。

            小結:

            在本練習中,您學習了如何使用性能分析器執行方法性能分析。

            返回頁首



            練習 3:分析對象創建過程以查找內存泄漏(20 分鐘)

            本練習的學習目的:

            作為練習 2 的后續練習,我們將在本練習中學習如何解釋某些性能分析器的圖形以監視應用程序創建對象的過程。下面將顯示一個內存泄漏示例。

            執行步驟:

            1. 本練習是在練習 2 的基礎上進行的,因此,請務必遵循練習 2 中的步驟。
            2. 從菜單中選擇“性能分析”>“分析主項目”。如果出現一個對話框,詢問您是否要停止當前的性能分析器進程以啟動新進程(如下所示),請單擊“是”按鈕繼續執行。

              “停止并重新啟動性能分析器”對話框

              將顯示“選擇性能分析任務”對話框。

            3. 在“選擇性能分析任務”對話框中,單擊占據較大區域的“監視應用程序”按鈕。
            4. 單擊“運行”按鈕。IDE 將會在左側顯示“性能分析器”控制臺。單擊 查看“遙測概覽”按鈕 按鈕,或者選擇“性能分析”>“視圖”>“遙測概覽”。NetBeans Profiler 將在底部的輸出窗口中顯示三個圖形,如下所示。

              查看監視器圖形

              在左側的圖形中,紅色的陰影部分表示分配的 JVM 堆大小。紫色的覆蓋部分表示實際使用的堆空間大小。在上面的示例中,上次更新所分配的堆大小已超過了 20 MB。其中,實際用來保存 Java 對象的堆大小略大于 10 MB。

              右側圖形顯示了 JVM 中的活動線程數。

              中間的圖形顯示了兩種重要的堆統計信息。

              • 藍線是 JVM 執行垃圾回收的時間占執行時間的百分比,它是以圖形右側上的 Y 軸為參照繪制的。JVM 執行垃圾回收所花的時間不能用來運行應用程序。因此,如果藍線占據較大的百分比,則需要考慮調整 JVM,方法是:配置更大的堆大小(請參閱 -Xmx 參數文檔),或者轉換到不同的垃圾回收算法中。
              • 紅線表示存活的生成數,它是以圖形左側的 Y 軸為參照進行繪制的。存活生成數是指 JVM 堆上所有 Java 對象不同生存期的數量,其中“生存期”被定義為對象存活時的垃圾回收次數。如果存活生成數的值較小,則表明堆上的大部分對象的存活時間基本相同。但是,如果存活生成數的值隨著時間的變化而增長到一個很高的比率,則表明應用程序正在分配新的對象,同時保持對已分配的多個舊對象的引用。如果實際上不再需要這些舊對象,則應用程序正在浪費(或“泄漏”)內存。

            5. 性能分析器可以對 CPU 性能或內存使用情況進行詳細的分析,但不能同時進行這兩種分析。要了解有關在 JVM 堆上分配對象以及執行對象的垃圾回收的詳細信息,請修改性能分析器的設置。單擊 查看“修改性能分析”按鈕 按鈕,或者選擇“性能分析”>“修改性能分析”。
            6. 單擊“分析內存使用情況”按鈕。
            7. 選擇“記錄對象創建和垃圾回收”單選按鈕。
            8. 選中“記錄分配的棧跟蹤”復選框。
            9. 單擊“確定”按鈕。
            10. 現在,您已經選擇了分析內存使用情況,您需要運行應用程序以確定它是否有效地使用了內存。單擊“內存泄漏”以轉至 MemoryLeak 演示頁。
            11. 在 MemoryLeak 演示頁上,單擊“開始泄漏”。
            12. 請注意存活生成數圖形中的峰值,如以下示例所示。這表明可能出現了內存泄漏。

              存活生成數圖形所示的峰值。

            13. 選擇“性能分析”>“視圖”>“實時結果”。Profiler 將顯示 JVM 堆中分配的對象的動態視圖。缺省情況下,它將按每個類的所有實例使用的字節數進行排序。由于懷疑可能出現了內存泄漏,因此,請單擊“生成數”列,按每個類的不同對象生存期數量對顯示結果進行排序。下面顯示了得到的顯示結果示例。

              先前的生成數圖形。
              這些列提供了對象分配和內存使用情況信息。

              • “分配的對象”是性能分析器正在監視的對象數。在本示例中,共監視了 38 個 float[] 實例。缺省情況下,該數字約為應用程序實際分配的對象數的 10%。通過只監視已創建對象的一部分,性能分析器可以顯著地減少它在 JVM 中的開銷,這樣,應用程序就幾乎可以按最快的速度運行了。
              • “活動對象”是仍在 JVM 堆中并因此占用內存的已分配對象數。
              • 兩個“活動字節”列顯示了活動對象所占用的堆內存量。一個列顯示圖形,另一個列顯示文本。
              • “平均生存期”值是使用活動對象計算的。每個對象的生存期是它存活時的垃圾回收次數。生存期總和除以活動對象數得到的結果就是平均生存期。
              • “生成數”值是使用活動對象計算的。與平均生存期相同,對象生存期是它存活時的垃圾回收次數?!吧蓴怠敝凳腔顒訉ο蟮牟煌嫫跀盗?。

            14. 隨著程序繼續運行,性能分析器將更新顯示結果。請留意 float[]double[] 條目。請注意其生成數值是如何持續增加的。結果是,float[]double[] 在列表中持續上移。最終,它們會顯示在列表的頂部,緊靠 java.util.HashMap$Entry(其生代數值也在不斷增加)下面。隨著應用程序繼續運行,java.util.HashMap$Entry、float[]double[] 生成數值持續增加,但任何其他類沒有增加。如下面的示例所示。

              后期的生成數圖形。

            15. 要了解導致生成數值持續增加的原因,請選擇“性能分析”>“生成收集結果的快照”。按生成數對顯示結果進行排序。右鍵單擊 double[] 條目,然后選擇“顯示分配棧跟蹤”。性能分析器將顯示所有分配了一個或多個 double[] 對象的方法。如下面的示例所示。

              double[] 棧跟蹤。
              請注意,在分配了 double[] 對象的方法中,只有一個方法創建了具有較大生成數值的 double[] 對象。該方法是 run(),它位于具有相應名稱 demo.memoryleak.LeakThread 的類中。

            16. 右鍵單擊 run() 方法條目,然后選擇“轉至源代碼...”。性能分析器將顯示源代碼,如下所示。引起泄漏的代碼
              請注意,正在分配 double[]float[] 對象,并隨后將其放在 HashMap 中。但一直并未刪除它們,這意味著,HashMap 保留的引用將會妨礙 JVM 對這些對象進行垃圾回收。這是非常典型的 Java 內存泄漏:將對象放在 Map 中,然后就忘記處理它們了。由于本示例中使用的 Map 就是 HashMap,因此,關聯的 java.util.HashMap$Entry 對象也出現了泄漏。

            17. 選擇“性能分析”>“停止”來結束性能分析會話,或者單擊 “停止”按鈕 按鈕。
            18. 在“項目”窗口中,選擇 exercise2 條目,然后從菜單中選擇“文件”>“關閉項目”。

            小結:

            在本練習中,您學習了如何使用性能分析器來監視應用程序創建對象的過程。您還看到了性能分析器在應用程序出現內存泄漏時所提供的各種類型的分析指數。

            国产精品久久久久久一区二区三区 | 亚洲国产欧美国产综合久久 | 狠狠色噜噜色狠狠狠综合久久| 一本色道久久综合狠狠躁篇 | 久久久免费精品re6| 丁香狠狠色婷婷久久综合| 国内精品免费久久影院| 大香伊人久久精品一区二区| 狠狠干狠狠久久| 午夜精品久久久久久影视riav| 无遮挡粉嫩小泬久久久久久久| 狠狠色丁香久久婷婷综| 一本色道久久综合狠狠躁篇| 国产精品久久久久久一区二区三区 | 精品无码久久久久久午夜| 久久一区二区三区免费| 久久精品国产99国产精品导航| 99久久精品无码一区二区毛片 | 青青草国产97免久久费观看| 72种姿势欧美久久久久大黄蕉| 色婷婷综合久久久久中文字幕| 久久精品嫩草影院| 久久亚洲精品成人av无码网站| 亚洲国产天堂久久综合| 欧美777精品久久久久网| 国产亚洲精久久久久久无码| 日本WV一本一道久久香蕉| 久久91这里精品国产2020| 久久99中文字幕久久| 精品久久久久久无码中文字幕一区| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久综合九色综合久99| 亚洲AV无码1区2区久久| 亚洲人成网站999久久久综合 | 久久久久久精品免费看SSS| 久久人搡人人玩人妻精品首页 | 国产精品免费福利久久| 蜜臀av性久久久久蜜臀aⅴ | 国产福利电影一区二区三区久久久久成人精品综合 | 热99RE久久精品这里都是精品免费 | 久久国产免费观看精品|