石家莊做網(wǎng)站建設(shè)的公司排名百度公司的發(fā)展歷程
一、基本概念
JProfiler:即“Java Profiler”,即“Java分析器”或“Java性能分析工具”。它是一款用于Java應用程序的性能分析和調(diào)試工具,主要幫助開發(fā)人員識別和解決性能瓶頸問題。
JVM:即“Java Virtual Machine”,即“Java虛擬機”。它是一個用于運行Java字節(jié)碼的抽象計算機。
(JProfiler分析的對象是Java應用程序,而這些程序都運行在JVM之上,JProfiler通過與JVM交互,收集有關(guān)CPU使用、內(nèi)存分配、線程狀態(tài)等詳細信息。JVM提供的這些數(shù)據(jù)是JProfiler分析性能瓶頸、內(nèi)存泄漏、線程死鎖等問題的基礎(chǔ)。由于JVM執(zhí)行的是Java字節(jié)碼,JProfiler可以直接分析字節(jié)碼級別的代碼執(zhí)行情況,從而精確定位到方法調(diào)用、代碼路徑等細節(jié)。)
內(nèi)存:是計算機中用來臨時存儲運行程序和數(shù)據(jù)的地方,運行中的數(shù)據(jù)和程序需要載入內(nèi)存,計算機才能對其進行處理。
(某些對象由于邏輯問題沒有被釋放時,內(nèi)存將逐漸耗盡,導致程序崩潰。JProfiler可以幫助檢測內(nèi)存泄漏,找出不再使用卻沒有釋放的對象,也可以通過JProfiler監(jiān)控內(nèi)存使用的高峰時刻,幫助識別應用在負載高峰時的內(nèi)存需求,確保程序在高壓力環(huán)境下穩(wěn)定運行。)
CPU:即“中央處理器”。它是計算機系統(tǒng)的核心處理單元,負責執(zhí)行指令和處理數(shù)據(jù),相當于計算機的大腦。
(在JProfiler中的主要作用是分析Java應用程序?qū)PU資源的使用情況。JProfiler能顯示各個方法的CPU使用情況,幫助開發(fā)者找到耗費CPU資源最多的代碼部分,識別性能瓶頸。”熱點”代碼,即在CPU使用中最頻繁被調(diào)用的方法或函數(shù),可以協(xié)助開發(fā)者優(yōu)化這些代碼以提升整體性能。)
SSH:SSH 是 "Secure Shell" 的縮寫,是一種網(wǎng)絡協(xié)議,用于安全地遠程登錄到另一臺計算機上,執(zhí)行命令和傳輸文件。
(SSH隧道提供了一種安全的方式,使得JProfiler可以從本地機器連接到遠程服務器上的JVM,而不需要直接在網(wǎng)絡上暴露JVM的管理端口。windows上查看SSH服務是否安裝Get-Service -Name sshd,開啟SSH服務Start-Service -Name sshd;另外對比TCP,TCP 屬于傳輸層協(xié)議,主要目的是提供一種可靠的端到端的數(shù)據(jù)傳輸服務,而 SSH 是一種應用層協(xié)議,它通常使用 TCP 作為其底層傳輸機制,主要目的是提供安全的遠程登錄和其他安全服務。)
二、操作步驟
1、連接JVM
1.1、分析本地JVM
attach模式選擇本地JVM快速連接
它可以用來分析本地的CPU狀況及除數(shù)組內(nèi)存數(shù)據(jù)以外的內(nèi)存狀況
launch模式選擇應用程序
選擇jar包后點擊開始會由JProfiler啟動JVM,它本質(zhì)也會在啟動的時候添加代理,所以可以完整的分析CPU狀況及內(nèi)存狀況(包括數(shù)組內(nèi)存數(shù)據(jù))
1.2、分析遠程JVM
attach模式選擇遠程JVM配置連接
連接遠程JVM,windows系統(tǒng)需要手動下載配置代理,其他系統(tǒng)則不需要
(在windows系統(tǒng)中,在遠程目標機器上將下載的jprofiler代理文件解壓后,在jar包啟動文件的命令中增加-agentpath設(shè)置代理,命令為 java -agentpath:"C:\Program Files\jprofiler14\bin\windows-x64\jprofilerti.dll=port=8890,nowait" -jar ectd-admin-web-v3.0.6.jar 。在會話設(shè)置中,需要手動指定分析的代理端口為8890)
2、內(nèi)存分析
2.1、功能介紹
使用上述紅框框出來的三部分功能進行內(nèi)存的分析,這里對這些功能進行簡要的介紹
遙測
????????內(nèi)存:可以查看當前系統(tǒng)的內(nèi)存整體情況,進而判斷系統(tǒng)中是否存在嚴重的內(nèi)存問題(比如內(nèi)存泄漏或內(nèi)存溢出)
實時內(nèi)存
????????所有對象:顯示當前系統(tǒng)的整體內(nèi)存分配情況
????????記錄的對象:顯示點擊 記錄內(nèi)存 后的所有對象的內(nèi)存情況,并且可以選擇活性模式(顯示存活對象或垃圾回收對象),然后可以點擊某個對象顯示分配熱點或分配調(diào)用樹情況
????????分配調(diào)用樹:顯示點擊點擊 記錄內(nèi)存 后,具有調(diào)用樹結(jié)構(gòu)的內(nèi)存分配情況,并且可以選擇活性模式,以及特定類型的對象進行查看
????????分配熱點:顯示點擊點擊 記錄內(nèi)存 后,分配頻率高的對象,可以以對象為維度去查看調(diào)用出處,并且也可以選擇活性模式,以及特定類型的對象進行查看
????????類跟蹤器:可以在前面從記錄的對象中選擇對象添加到類跟蹤器中,查看特定對象內(nèi)存的變化和釋放
堆遍歷器
選擇生成快照或在記錄對象中選擇指定對象在堆遍歷器中查看,堆遍歷器快照只顯示無引用鏈的對象(包括GC的對象以及暫時存活未被GC但無引用的對象),通過堆遍歷器快照可查看異常未回收對象被誰所持有從而找出內(nèi)存溢出問題
2.2、分析步驟
2.2.1、首先查看遙測中的內(nèi)存總覽,查看內(nèi)存是否存在高占用的情況
2.2.2、查看實時內(nèi)存中的所有對象,初步查看內(nèi)存中已經(jīng)存在的占用高內(nèi)存的對象是誰
2.2.3、復現(xiàn)場景并記錄分配調(diào)用棧數(shù)據(jù),并設(shè)置調(diào)用樹分配選項為所有類和所有對象,查看分配調(diào)用樹,確定占用高內(nèi)存的對象的代碼位置(使用分配熱點根據(jù)對象反向查看調(diào)用位置也可以)
2.2.4、將異常對象添加到類跟蹤器,結(jié)合代碼確認對象內(nèi)存是否正常釋放而不存在內(nèi)存泄漏問題
2.2.5、假如高占用內(nèi)存的對象已經(jīng)確定且無內(nèi)存泄漏,查看其在堆內(nèi)快照的引用,判斷是否被不正確的持有未釋放而導致內(nèi)存溢出問題
3、CPU分析
3.1、功能介紹
使用上述紅框框出來的三部分功能進行CPU的分析,這里對這些功能進行簡要的介紹
遙測
????????CPU負載:可以查看當前系統(tǒng)的CPU負載整體情況,判斷系統(tǒng)中是否存在CPU使用率過高的問題
CPU視圖
????????調(diào)用樹:顯示點擊 記錄CPU 后,當前程序中各個方法或線程的 CPU 使用情況,并且可以選擇具體的線程及線程狀態(tài)進行篩選
????????熱點:顯示點擊 記錄CPU 后,列出消耗最多資源的方法或類,通常是性能瓶頸所在的地方,并且可以選擇具體的線程及線程狀態(tài)進行篩選
????????調(diào)用圖:顯示點擊 記錄CPU 后,局部線程調(diào)用的CPU使用情況,并且可以選擇具體的線程中的節(jié)點作為最初顯示的節(jié)點去創(chuàng)建調(diào)用圖
異常值檢測:顯示點擊 記錄CPU 后,存在相較于自身平均調(diào)用時間特別突出(異常系數(shù))的方法
其他功能項不常用略過
3.2、分析步驟
3.2.1、首先查看遙測中的CPU負載總覽,查看內(nèi)存是否存在高使用的情況
3.2.2、復現(xiàn)場景并記錄CPU數(shù)據(jù),查看調(diào)用樹或者熱點確定CPU占用率高的方法的代碼位置(如果有需要也可也對指定調(diào)用的線程方法設(shè)置線程圖更加簡明的查看)
3.2.3、查看異常值檢測,排除存在異常的方法如有必要進行進一步的分析
總結(jié)
JProfiler通過給JVM啟動添加代理去追蹤和記錄相關(guān)內(nèi)存及CPU數(shù)據(jù)以不同的形式呈現(xiàn)出來,關(guān)鍵點在于根據(jù)需求決定呈現(xiàn)形式的參數(shù)或配置
三、額外補充
1、其他子系統(tǒng)探針

如圖,為JProfiler為JRE中的重要子系統(tǒng)提供了一些探針。探針將instrumentation添加到特定的類中,以便收集其數(shù)據(jù),從運行的應用程序中提取語義數(shù)據(jù),并將其顯示在分析器中。
現(xiàn)在介紹其中部分常用的幾個探針:
數(shù)據(jù)庫
????????JDBC:當點擊記錄探針JDBC及記錄CPU后,即可完整查看JDBC探針數(shù)據(jù),包括時間線、連接情況、在調(diào)用樹中的耗時,熱點、還有執(zhí)行情況總覽等,有助于分析SQL中引起的性能瓶頸
HTTP,RPC & JEE
????????HTTP服務器:點擊 記錄探針HTTP服務器 ,可以查看來自瀏覽器等客戶端傳入的HTTP請求狀況,包括請求的熱點、總覽等
????????HTTP客戶端:點擊 記錄探針HTTP客戶端?,可以查看從服務器傳出的HTTP請求狀況,包括請求的調(diào)用樹(需要開啟記錄CPU)、熱點、總覽等
2、IntelliJ IDEA集成
在IDEA的設(shè)置——插件中搜索JProfiler然后安裝,安裝完成后重啟IDEA即可使用JProfiler啟動,這樣啟動時會直接拉起JProfiler進行相關(guān)數(shù)據(jù)的統(tǒng)計,并且在調(diào)用書中點擊顯示源碼時,可直接跳轉(zhuǎn)到IDEA中顯示對應的代碼位置
3、手動添加源碼
通過上述方式可添加源碼,這樣在調(diào)用樹中雙擊即可查看源碼(但是只是定位到類)
通過上述方式可在調(diào)用樹上增加代碼行數(shù)的顯示,這樣方便在顯示的源代碼類中找到對應行
4、性能問題與配置
JProfiler連接到JVM后,會對其性能造成一定的影響。這種性能影響的程度與JProfiler的配置和使用的功能模塊有關(guān)。具體影響方面比如監(jiān)控開銷(在目標JVM中插入探針來跟蹤方法調(diào)用,這會增加額外的計算和內(nèi)存開銷)、內(nèi)存開銷(維護大量的數(shù)據(jù)結(jié)構(gòu)來存儲分析信息,比如堆棧數(shù)據(jù)等)、網(wǎng)絡通信(遠程連接)、IO影響(快照寫入)等。
需要注意的配置和操作
????????方法調(diào)用記錄類型:對于I/O密集型(輸入輸出頻率高,比如磁盤、數(shù)據(jù)庫、REST請求)選擇Instrumentation模式(會修改選定類的字節(jié)碼以跟蹤方法的進入和退出),選擇指定的方法或包,可以更詳細的查看方法的信息包括調(diào)用次數(shù);對于計算密集型(CPU運算和數(shù)據(jù)處理強度高,比如圖片視頻文檔分析處理、大規(guī)模運算、加解密)選擇異步采樣,可以獲取更準確的CPU時間;其他情況一般選擇全采樣即可
????????采樣頻率:如果將方法調(diào)用記錄類型設(shè)置為采樣,采樣頻率越高,數(shù)據(jù)越詳細,但性能開銷也越大??梢栽?方法調(diào)用記錄 中選擇采用間隔的ms數(shù)控制
????????方法忽略:如果將方法調(diào)用記錄類型設(shè)置為instrumentation,所有分析類的方法都會被測量,這對于執(zhí)行時間很短的方法來說, 會產(chǎn)生很大的開銷。為了緩解instrumentation的問題,JProfiler有一個叫做自動調(diào)節(jié)的機制。分析代理會不時地檢查instrumentation開銷很高的方法, 并將它們傳送到JProfiler GUI中,可以單擊該狀態(tài)欄條目來查看檢測到的開銷熱點,并選擇將其納入忽略方法列表。在 高級設(shè)置 的 CPU分析 中可以開啟或關(guān)閉自動調(diào)節(jié)
? ? ? ? 觸發(fā)器設(shè)置:可以在 會話設(shè)置 中的 觸發(fā)器設(shè)置 中設(shè)置觸發(fā)器條件,合理設(shè)置觸發(fā)器可以減少不必要的數(shù)據(jù)收集,降低性能開銷。比如設(shè)置 CPU 使用率超過某個閾值時開始收集數(shù)據(jù),或者置特定方法調(diào)用次數(shù)超過某個閾值時開始收集數(shù)據(jù)
? ? ? ? 避免多開:比如同時開啟CPU記錄和分配記錄,或者還有其他比如JDBC、HTTP探針等,盡量需要查看哪個記錄哪個模塊,不用的就停止記錄
? ? ? ??