操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    使用 VisualVM 進行性能分析及調優

    虞 立軍, 王 建光, 和 倪 力

    概述

    開發大型 Java 應用程序的過程中難免遇到內存泄露、性能瓶頸等問題,比如文件、網絡、數據庫的連接未釋放,未優化的算法等。隨著應用程序的持續運行,可能會造成整個系統運行效率下降,嚴重的則會造成系統崩潰。為了找出程序中隱藏的這些問題,在項目開發后期往往會使用性能分析工具來對應用程序的性能進行分析和優化。

    VisualVM 是一款免費的性能分析工具。它通過 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多種方式從程序運行時獲得實時數據,從而進行動態的性能分析。同時,它能自動選擇更快更輕量級的技術盡量減少性能分析對應用程序造成的影響,提高性能分析的精度。

    本文將對 VisualVM 的主要功能逐一介紹并探討如何利用獲得的數據進行性能分析及調優。

    背景知識

    性能分析的主要方式

    • 監視:監視是一種用來查看應用程序運行時行為的一般方法。通常會有多個視圖(View)分別實時地顯示 CPU 使用情況、內存使用情況、線程狀態以及其他一些有用的信息,以便用戶能很快地發現問題的關鍵所在。
    • 轉儲:性能分析工具從內存中獲得當前狀態數據并存儲到文件用于靜態的性能分析。Java 程序是通過在啟動 Java 程序時添加適當的條件參數來觸發轉儲操作的。它包括以下三種:
    • 系統轉儲:JVM 生成的本地系統的轉儲,又稱作核心轉儲。一般的,系統轉儲數據量大,需要平臺相關的工具去分析,如 Windows 上的 windbg 和 Linux 上的 gdb。
    • Java 轉儲:JVM 內部生成的格式化后的數據,包括線程信息,類的加載信息以及堆的統計數據。通常也用于檢測死鎖。
    • 堆轉儲:JVM 將所有對象的堆內容存儲到文件。
    • 快照:應用程序啟動后,性能分析工具開始收集各種運行時數據,其中一些數據直接顯示在監視視圖中,而另外大部分數據被保存在內部,直到用戶要求獲取快照,基于這些保存的數據的統計信息才被顯示出來。快照包含了應用程序在一段時間內的執行信息,通常有 CPU 快照和內存快照兩種類型。
    • CPU 快照:主要包含了應用程序中函數的調用關系及運行時間,這些信息通常可以在 CPU 快照視圖中進行查看。
    • 內存快照:主要包含了內存的分配和使用情況、載入的所有類、存在的對象信息及對象間的引用關系等。這些信息通常可以在內存快照視圖中進行查看。
    • 性能分析:性能分析是通過收集程序運行時的執行數據來幫助開發人員定位程序需要被優化的部分,從而提高程序的運行速度或是內存使用效率,主要有以下三個方面:
    • CPU 性能分析:CPU 性能分析的主要目的是統計函數的調用情況及執行時間,或者更簡單的情況就是統計應用程序的 CPU 使用情況。通常有 CPU 監視和 CPU 快照兩種方式來顯示 CPU 性能分析結果。
    • 內存性能分析:內存性能分析的主要目的是通過統計內存使用情況檢測可能存在的內存泄露問題及確定優化內存使用的方向。通常有內存監視和內存快照兩種方式來顯示內存性能分析結果。
    • 線程性能分析:線程性能分析主要用于在多線程應用程序中確定內存的問題所在。一般包括線程的狀態變化情況,死鎖情況和某個線程在線程生命期內狀態的分布情況等

    VisualVM 安裝

    VisualVM 是一個性能分析工具,自從 JDK 6 Update 7 以后已經作為 Oracle JDK 的一部分,位于 JDK 根目錄的 bin 文件夾下。VisualVM 自身要在 JDK6 以上的版本上運行,但是它能夠監控 JDK1.4 以上版本的應用程序。下面主要介紹如何安裝 VisualVM 以及各種 VisualVM 上的插件。

    安裝 VisualVM

    VisualVM 項目的官方網站目前提供英文版本和多語言支持版本下載。多語言版本主要支持英語、日語以及中文三種語言。如果下載安裝多語言版本的 VisualVM,安裝程序會依據操作系統的當前語言環境去安裝相應 VisualVM 的語言版本。最新 VisualVM 版本主要支持的操作系統包括:Microsoft Windows (7, Vista, XP, Server)、Linux、Sun Solaris、Mac OS X、HP-UX 11i。本文以 Microsoft Windows XP 為安裝環境并支持中文。

    • 從 VisualVM 項目的官方網站上下載 VisualVM 安裝程序。
    • 將 VisualVM 安裝程序解壓縮到本地系統。
    • 導航至 VisualVM 安裝目錄的 bin 目錄,然后啟動 jvisualvm.exe。

    安裝 VisualVM 上的插件

    VisualVM 插件中心提供很多插件以供安裝向 VisualVM 添加功能。可以通過 VisualVM 應用程序安裝,或者從 VisualVM 插件中心手動下載插件,然后離線安裝。另外,用戶還可以通過下載插件分發文件 (.nbm 文件 ) 安裝第三方插件為 VisualVM 添加功能。

    從 VisualVM 插件中心安裝插件安裝步驟 :

    • 從主菜單中選擇“工具”>“插件”。
    • 在“可用插件”標簽中,選中該插件的“安裝”復選框。單擊“安裝”。
    • 逐步完成插件安裝程序。

    圖 1. VisualVM 插件管理器

    點擊查看大圖

    根據 .nbm 文件安裝第三方插件安裝步驟 :

    • 從主菜單中選擇“工具”>“插件”。
    • 在“已下載”標簽中,點擊"添加插件"按鈕,選擇已下載的插件分發文件 (.nbm) 并打開。
    • 選中打開的插件分發文件,并單擊"安裝"按鈕,逐步完成插件安裝程序。

    圖 2. 通過 .nbm 文件安裝 VisualVM 插件

    點擊查看大圖

    功能介紹

    下面我們將介紹性能分析的幾種常見方式以及如何使用 VisualVM 性能分析工具進行分析。

    內存分析

    VisualVM 通過檢測 JVM 中加載的類和對象信息等幫助我們分析內存使用情況,我們可以通過 VisualVM 的監視標簽和 Profiler 標簽對應用程序進行內存分析。

    在監視標簽內,我們可以看到實時的應用程序內存堆以及永久保留區域的使用情況。

    圖 3. 內存堆使用情況

    點擊查看大圖

    圖 4. 永久保留區域使用情況

    點擊查看大圖

    此外,我們也可以通過 Applications 窗口右擊應用程序節點來啟用“在出現 OOME 時生成堆 Dump”功能,當應用程序出現 OutOfMemory 例外時,VisualVM 將自動生成一個堆轉儲。

    圖 5. 開啟“在出現 OOME 時生成堆”功能

    在 Profiler 標簽,點擊“內存”按鈕將啟動一個內存分析會話,等 VisualVM 收集和統計完相關性能數據信息,將會顯示在性能分析結果。通過內存性能分析結果,我們可以查看哪些對象占用了較多的內存,存活的時間比較長等,以便做進一步的優化。

    此外,我們可以通過性能分析結果下方的類名過濾器對分析結果進行過濾。

    圖 6. 內存分析結果

    點擊查看大圖

    CPU 分析

    VisualVM 能夠監控應用程序在一段時間的 CPU 的使用情況,顯示 CPU 的使用率、方法的執行效率和頻率等相關數據幫助我們發現應用程序的性能瓶頸。我們可以通過 VisualVM 的監視標簽和 Profiler 標簽對應用程序進行 CPU 性能分析。

    在監視標簽內,我們可以查看 CPU 的使用率以及垃圾回收活動對性能的影響。過高的 CPU 使用率可能是由于我們的項目中存在低效的代碼,可以通過 Profiler 標簽的 CPU 性能分析功能進行詳細的分析。如果垃圾回收活動過于頻繁,占用了較高的 CPU 資源,可能是由內存不足或者是新生代和舊生代分配不合理導致的等。

    圖 7. CPU 使用情況

    點擊查看大圖

    在 Profiler 標簽,點擊“CPU”按鈕啟動一個 CPU 性能分析會話 ,VisualVM 會檢測應用程序所有的被調用的方法。當進入一個方法時,線程會發出一個“method entry”的事件,當退出方法時同樣會發出一個“method exit”的事件,這些事件都包含了時間戳。然后 VisualVM 會把每個被調用方法的總的執行時間和調用的次數按照運行時長展示出來。

    此外,我們也可以通過性能分析結果下方的方法名過濾器對分析結果進行過濾。

    圖 8. CPU 性能分析結果

    點擊查看大圖

    線程分析

    Java 語言能夠很好的實現多線程應用程序。當我們對一個多線程應用程序進行調試或者開發后期做性能調優的時候,往往需要了解當前程序中所有線程的運行狀態,是否有死鎖、熱鎖等情況的發生,從而分析系統可能存在的問題。

    在 VisualVM 的監視標簽內,我們可以查看當前應用程序中所有活動線程和守護線程的數量等實時信息。

    圖 9. 活躍線程情況

    點擊查看大圖

    VisualVM 的線程標簽提供了三種視圖,默認會以時間線的方式展現。另外兩種視圖分別是表視圖和詳細信息視圖。

    時間線視圖上方的工具欄提供了縮小,放大和自適應三個按鈕,以及一個下拉框,我們可以選擇將所有線程、活動線程或者完成的線程顯示在視圖中。

    圖 10. 線程時間線視圖

    圖 11. 線程表視圖

    我們在詳細信息視圖中不但可以查看所有線程、活動線程和結束的線程的詳細數據,而且也可以查看某個線程的詳細情況。

    圖 12. 線程詳細視圖

    快照功能

    我們可以使用 VisualVM 的快照功能生成任意個性能分析快照并保存到本地來輔助我們進行性能分析。快照為捕獲應用程序性能分析數據提供了一個很便捷的方式因為快照一旦生成可以在任何時候離線打開和查看,也可以相互傳閱。

    VisualVM 提供了兩種類型的快照:

    • Profiler 快照:當有一個性能分析會話(內存或者 CPU)正在進行時,我們可以通過性能分析結果工具欄的“快照”按鈕生成 Profiler 快照捕獲當時的性能分析數據。

    圖 13. Profiler 快照

    • 應用程序快照:我們可以右鍵點擊左側 Applications 窗口中應用程序節點,選擇“應用程序快照”為生成一個應用程序快照。應用程序快照會收集某一時刻的堆轉儲,線程轉儲和 Profiler 快照,同時也會捕獲 JVM 的一些基本信息。

    圖 14. 應用程序快照

    轉儲功能

    線程轉儲的生成與分析

    VisualVM 能夠對正在運行的本地應用程序生成線程轉儲,把活動線程的堆棧蹤跡打印出來,幫助我們有效了解線程運行的情況,診斷死鎖、應用程序癱瘓等問題。

    圖 15. 線程標簽及線程轉儲功能

    當 VisualVM 統計完應用程序內線程的相關數據,會把這些信息顯示新的線程轉儲標簽。

    圖 16. 線程轉儲結果

    堆轉儲的生成與分析

    VisualVM 能夠生成堆轉儲,統計某一特定時刻 JVM 中的對象信息,幫助我們分析對象的引用關系、是否有內存泄漏情況的發生等。

    圖 17. 監視標簽及堆轉儲功能

    當 VisualVM 統計完堆內對象數據后,會把堆轉儲信息顯示在新的堆轉儲標簽內,我們可以看到摘要、類、實例數等信息以及通過 OQL 控制臺執行查詢語句功能。

    堆轉儲的摘要包括轉儲的文件大小、路徑等基本信息,運行的系統環境信息,也可以顯示所有的線程信息。

    圖 18. 堆轉儲的摘要視圖

    從類視圖可以獲得各個類的實例數和占用堆大小數,分析出內存空間的使用情況,找出內存的瓶頸,避免內存的過度使用。

    圖 19. 堆轉儲的類視圖

    通過實例數視圖可以獲得每個實例內部各成員變量的值以及該實例被引用的位置。首先需要在類視圖選擇需要查看實例的類。

    圖 20. 選擇查詢實例數的類

    圖 21. 實例數視圖

    此外,還能對兩個堆轉儲文件進行比較。通過比較我們能夠分析出兩個時間點哪些對象被大量創建或銷毀。

    圖 22. 堆轉儲的比較

    點擊查看大圖

    圖 23. 堆轉儲的比較結果

    線程轉儲和堆轉儲均可以另存成文件,以便進行離線分析。

    圖 24. 轉儲文件的導出

    總結

    本文首先簡要列舉了一些性能分析相關的背景知識。然后介紹了 VisualVM 的下載和安裝。最后從內存性能、CPU 性能、快照功能以及轉儲功能四個方面展開,進一步說明了如何使用 VisualVM 進行性能分析。通過本文的介紹,相信讀者對性能分析會有一定的了解,并可以利用 VisualVM 進行性能分析。

    更多互聯網新鮮資訊、工作奇淫技巧關注原創【飛魚在浪嶼】(日更新)


    暴雪使用Visual Studio 2019在WSL上調試Linux core dump。

    介紹

    在《暗黑破壞神IV》上,暴雪在Windows上開發了所有代碼,并可以在多個平臺上進行編譯。這包括運行在Linux上的服務器。(該代碼在必要時包括條件編譯和特定于定制平臺的代碼)。此工作流程有多種原因。一方面,服務器程序員也最熟悉Windows開發。另一個也是最重要的原因是Visual Studio提供的功能和強大的工具集。即使要在Linux上本機開發,在Linux世界中也沒有什么可比的。

    但是,這在部署的服務器崩潰時帶來了一些挑戰。調試生成的coredump,可以選擇遠程登錄崩潰的VM(或是容器),然后運行gdb來診斷那里的崩潰。但是這樣做有很多缺點。首先,使用二進制文件來部署源,因此在VM或容器上的gdb會話中源不可用。

    另一個障礙是gdb本身:除非定期使用gdb,否則將無法保持一定的熟練程度。

    希望有一種更直觀的方法來調試Linux內核。這就是為什么能夠利用新的Visual Studio功能,能夠在熟悉的Visual Studio環境中做到這一點!


    調試流程

    僅當安裝WSL或將Linux連接添加到Connection Manager時,才啟用Visual Studio Linux核心調試工作流。服務器開發人員使用安裝WSL,運行腳本,該腳本還安裝了在WSL中構建服務器所需的所有開發工具和支持庫。(WSL是開發人員可以在Linux版本中測試Linux環境。進入WSL,cd進入共享代碼目錄以及從那里直接構建。這比運行VM甚至是容器要好得多。如果使用CMake進行構建,則還可以利用Visual Studio對WSL的本機支持。)

    Windows上開發代碼,擁有可在Windows下運行的Windows版本的服務器。但是,在Linux上部署服務器,這需要在Linux本身上生成的構建。Linux構建是在構建服務器場上生成的,該構建服務器場使用Linux機器上的構建系統來構建服務器及其要部署的容器。Linux可執行文件僅部署在容器中,開發人員通常無法訪問它。

    當服務器在基礎架構中崩潰時,自動化流程會通知,并將coredump存檔到網絡共享中。要在Linux或Visual Studio中調試core,必須具有正在運行的可執行文件。它還有助于調試已部署容器上使用的確切共享庫。另一個腳本來獲取這些文件。首先,將core復制到本地計算機,然后運行腳本并將其指向core。該腳本下載使用該版本構建的Docker容器,從中提取服務器二進制文件,以及某些共享的運行時庫供gdb使用。(這避免了WSL版本與已部署的Linux版本不完全匹配時可能遇到的gdb兼容性問題。)

    然后,切換到Visual Studio,加載sln項目以構建Windows版本的服務器。然后,在“調試”->“其他調試目標”->“僅使用本機調試Linux核心轉儲”下打開新的調試對話框。啟用“在WSL上調試”復選框,并填寫核心文件和服務器二進制文件的(特定于WSL!)路徑。之后,我們點擊“調試”并觀察!

    Visual Studio在后臺調用WSL中的gdb,彈出一個崩潰的調用堆棧,指令指針位于相關代碼行上。

    接下來是識別崩潰的任務。有一個崩潰處理程序來攔截崩潰以執行一些內務處理,因此實際崩潰將落在單線程服務器中的調用堆棧中。但是,某些服務器是多線程的,崩潰可能是由這些線程中的任何一個引起的。崩潰處理程序記錄了崩潰文件和行號的來源,因此檢查這些變量將提供第一個線索。將查找執行該代碼的調用堆棧。

    使用gdb獲取所有線程的回溯并仔細閱讀結果列表,以查看哪個線程具有最有可能崩潰的調用堆棧。例如,如果一個線程僅在休眠,則很可能不是崩潰的線程。我們將尋找一個棧,其內容要多于用“睡眠”設置的幾個幀,然后檢查代碼以查看問題是否明顯,或者進入gdb本身以檢查進程狀態。

    但是,Visual Studio提供了比其強大得多的選項。對于多線程core,可以在調試會話中打開“線程”窗口,并在每個線程中四處查看以查看堆棧的外觀。這與gdb方法非常相似,如果有50個線程,可能會非常乏味。幸運的是,有一個功能可以使此操作變得更加容易:并行堆棧

    Parallel Stacks。調用Debug-> Windows-> Parallel Stacks(僅在調試會話期間可用)會打開一個新窗口,其中顯示了進程中每個線程的調用堆棧。這是您整個過程空間的視圖。可以雙擊任何線程中的任何堆棧框架,Visual Studio會在源和調用堆棧窗口中都跳轉到該框架。這是一個非常節省的時間。

    一旦可以看到崩潰附近的代碼,就可以使用鼠標懸停,QuickWatch或Visual Studio中的其他任何工具檢查變量。的確,在發布版本中,許多變量已被優化,但同時許多變量沒有被優化!與使用gdb相比,使用Visual Studio界面可以更快地解決問題。

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有