JProfiler入門筆記
1 前言
開始之前,我問自己,為什麼要學習jProfiler?
回答之前先讓我們來看看什麼是jProfiler:JProfiler是一個商業授權的Java剖析工具,由EJ技術有限公司,針對Java EE和Java SE應用程式開發的。它允許兩個記憶體剖面評估記憶體使用情況和動態分配洩漏和CPU剖析,以評估執行緒衝突。JProfiler直覺式的GUI讓你可以找到效能瓶頸、抓出記憶體漏失(memory leaks)、並解決執行緒的問題。[from 百度百科]
簡而言之,它能通過評估CPU、記憶體以及執行緒來避免記憶體漏失,是一個性能監測工具。
那我們為何要監控效能呢?
試想,我們釋出在伺服器上的專案如何測試其健壯性以及可行性?如何做出一個合格放心的產品來?我給出的答案是在負載測試下進行資料收集和資料監控,調整你的程式碼或者配置使你的專案執行狀況達到最優。
jProfiler正是扮演著這樣的一個角色,那麼對於完全沒接觸過的人,如何開始?請移步下文。
2 如何開始
2.1 下載、安裝並和JProfiler say HelloWorld
Step 1,到EJ的專案主頁下載最新版的JProfiler。
Step 2,安裝之。筆者這裡有一個JProfiler7的License Key:L-J7-feng#1000-289nsew356eehq#9163,填寫金鑰時name和company隨便填就好了[分享即是美德]。假如金鑰失效,安裝後有免費的10天試用期,選中“Evaluation”表示評估試用即可。
Step 3,假設我們是用Eclipse開發的,點選Session→IDE Integrations,選中你的Eclipse版本,點選OK然後按提示操作即可。操作成功後,我們可以在Eclipse看到JProfiler擴充套件外掛如下:
Step 4,讓我們來用一個小小的測試例子開啟jProfiler之旅,編寫程式如下,並執行之。再點選圖示啟動JProfiler。
package jProfiler; public class Test extends Thread{ public static void main(String[] args) throws InterruptedException { Test t = new Test(); for(int i=1; i<10000; i++) { new HelloWorld(); t.sleep(100); // 休眠100毫秒 } } } class HelloWorld { public HelloWorld() { System.out.println("Hello Jayzee!"); } }
Step 5,jProfiler啟動的時候會自動捕獲到執行中的J2SE和J2EE程式,如下所示,選中並點選OK(tips:你也可以點"Show Services"進行手動重新整理,JProfiler會自動幫你捕獲執行中的java程式)。
勾選記錄CPU和在啟動的時候記錄分配情況,其他的預設不動即可。
Step 6,通過上面的操作我們就可以看到JProfiler的監控介面啦
Step 7,關於一些詳細使用方法我們在下文中講解,這一章節的最後有一個小技巧講給大家。在我們關閉的時候,JProfiler會提示我們要不要儲存當前使用的這個session,我們點選儲存,以後就可以在Session→Start Center裡面直接呼叫這個session了。
然而實際上記錄的這個"Helloworld"的session是不可以執行的,這裡只是跟大家講解一下怎樣使用這個技巧而已。
如何讓這個Helloworld跑起來?你需要在cmd下用javac命令把Test.java編譯成Test.class然後點選上圖右上的紅框處,然後進行兩個配置:1.選中Launch模式並點選Application按鈕;2.在Main class選中你編譯好的class檔案然後逐步按確認。
配置好之後你就可以通說雙擊這個session來啟動啦,效果如下:
2.2 配置tomcat專案並啟用監控
假設你手頭上有個專案是要釋出在tomcat伺服器上的,例如筆者手頭上的專案名稱是DSPMSU_For_Display,tomcat伺服器是7.x版本,下面我們講解如何對這個本地的tomcat7伺服器進行監控,細節如下:
點選Session→Integration Wizards→New Server Integration→Apache Tomcat 7.x→On this computer→勾選你的JVM資訊→Waif for a connection from the JProfiler GUI(就是由JProfiler幫你啟動tomcat)→選著你的startup.bat→保持預設埠8849→啟動。
tips:
1. 你在JProfiler中儲存的這個session,如果你雙擊執行它,它的實質也是去呼叫startup.bat來啟動,因此假如你已經手動啟用了tomcat然後又在JProfiler啟動這個session,這時候就會報錯--埠被佔用;
2. 監控過程中,假如tomcat意外關閉,這時候會報下面這樣一個錯誤,錯誤提示你要勾選"Keep VM alive",在Start Center編輯你儲存的session→Profiling Settings選項卡→Customize Profiling Settings→Miscellaneous→Keep VM alive即可。
3 如何監控效能
3.1 直觀認識
這麼強大的一個工具,怎樣效能監控呢?這個課題太大,我們把範圍縮小一點,如何入門呢?偶然在CSDN上找到一位blogger的博文,裡面的“實戰”例子絕對可以讓你對效能監控有一個直觀的認識。
.
.
.
.
.
.
.
幾分鐘很快就過去了,讓我們做以下幾個總結:
1. 在Memory Views視圖裡右擊相關類,選中Mark Current Values可以標記當前值,方便後續進行比較,注意綠色和紅色之分;
標記完之後,通過GUI介面可以很方便的看出值的變化情況
2. 按F4或者點選窗體上面的綠色圖示Run GC可以通知JVM進行垃圾回收的動作(只是通知,不是強制回收);
3. 在Memory Views視圖裡右擊相關類,點選Show Selection In Heap Walker可以進行堆記憶體跟蹤;
4. 在Heap Walker檢視中右擊相關類,點選Used Selected Instances→Allocation Tree可以看到關於該類的呼叫細節和記憶體使用情況。
Allocation tree看的是呼叫樹,你也可以根據需要選擇其他選項。
3.2 模組介紹
模組的介紹主要是對JProfiler的具體功能進行介紹,部分內容參照自部落格:JProfiler 解決 Java 伺服器的效能跟蹤,如果讀者英文閱讀能力比較強也可以在工具欄上邊點選Help,直接閱讀英文幫助,下文部分內容亦是參照自英文API。
3.2.1 記憶體檢視 Memory Views
JProfiler的記憶體檢視部分可以提供動態的記憶體使用狀況更新檢視和顯示關於記憶體分配狀況資訊的檢視。所有的檢視都有幾個聚集層並且能夠顯示現有存在的物件和作為垃圾回收的物件。
- 所有物件 All Objects
顯示類或在狀況統計和尺碼資訊堆上所有物件的包。你可以標記當前值並顯示差異值。 - 記錄物件 Record Objects
顯示類或所有已記錄物件的包。你可以標記出當前值並且顯示差異值。 - 分配訪問樹 Allocation Call Tree
顯示一棵請求樹或者方法、類、包或對已選擇類有帶註釋的分配資訊的J2EE元件。 - 分配熱點 Allocation Hot Spots
顯示一個列表,包括方法、類、包或分配已選類的J2EE元件。你可以標註當前值並且顯示差異值。對於每個熱點都可以顯示它的跟蹤記錄樹。 - 類追蹤器 Class Tracker
類跟蹤檢視可以包含任意數量的圖表,顯示選定的類和包的例項與時間。
3.2.2 堆遍歷 Heap Walker
在JProfiler的堆遍歷器(Heap Walker)中,你可以對堆的狀況進行快照並且可以通過選擇步驟下尋找感興趣的物件。堆遍歷器有五個檢視:
- 類 Classes
顯示所有類和它們的例項,可以右擊具體的類"Used Selected Instance"實現進一步跟蹤。 - 分配 Allocations
為所有記錄物件顯示分配樹和分配熱點。 - 索引 References
為單個物件和“顯示到垃圾回收根目錄的路徑”提供索引圖的顯示功能。還能提供合併輸入檢視和輸出檢視的功能。 - 時間 Time
顯示一個對已記錄物件的解決時間的柱狀圖。 - 檢查 Inspections
顯示了一個數量的操作,將分析當前物件集在某種條件下的子集,實質是一個篩選的過程。 - 圖表 Graph
你需要在references檢視和biggest檢視手動新增物件到圖表,它可以顯示物件的傳入和傳出引用,能方便的找到垃圾收集器根源。
tips:在工具欄點選"Go To Start"可以使堆記憶體重新計數,也就是回到初始狀態。
3.2.3 CPU 檢視 CPU Views
JProfiler 提供不同的方法來記錄訪問樹以優化效能和細節。執行緒或者執行緒組以及執行緒狀況可以被所有的檢視選擇。所有的檢視都可以聚集到方法、類、包或J2EE元件等不同層上。CPU檢視部分包括:
- 訪問樹 Call Tree
顯示一個積累的自頂向下的樹,樹中包含所有在JVM中已記錄的訪問佇列。JDBC,JMS和JNDI服務請求都被註釋在請求樹中。請求樹可以根據Servlet和JSP對URL的不同需要進行拆分。 - 熱點 Hot Spots
顯示消耗時間最多的方法的列表。對每個熱點都能夠顯示回溯樹。該熱點可以按照方法請求,JDBC,JMS和JNDI服務請求以及按照URL請求來進行計算。 - 訪問圖 Call Graph
顯示一個從已選方法、類、包或J2EE元件開始的訪問佇列的圖。 - 方法統計 Method Statistis
顯示一段時間內記錄的方法的呼叫時間細節。
3.2.4 執行緒檢視 Thread Views
JProfiler通過對執行緒歷史的監控判斷其執行狀態,並監控是否有執行緒阻塞產生,還能將一個執行緒所管理的方法以樹狀形式呈現。對執行緒剖析,JProfiler提供以下檢視:
- 執行緒歷史 Thread History
顯示一個與執行緒活動和執行緒狀態在一起的活動時間表。 - 執行緒監控 Thread Monitor
顯示一個列表,包括所有的活動執行緒以及它們目前的活動狀況。 - 執行緒轉儲 Thread Dumps
顯示所有執行緒的堆疊跟蹤。
3.2.5 監控器檢視 Monitor Views
JProfiler提供了不同的監控器檢視,如下所示:
- 當前鎖定圖表 Current Locking Graph
顯示JVM中的當前鎖定情況。 - 當前監視器 Current Monitors
顯示當前正在等待或阻塞中的執行緒操作。 - 鎖定歷史圖表 Locking History Graph
顯示記錄在JVM中的鎖定歷史。 - 監控器歷史 Monitor History
顯示等待或者阻塞的歷史。 - 監控器使用統計 Monitor Usage Statistics
計算統計監控器監控的資料。
3.2.6 VM遙感勘測技術檢視 VM Telemetry Views
觀察JVM的內部狀態,JProfiler提供了不同的遙感勘測檢視,如下所示:
- 記憶體 Memory
顯示堆疊的使用狀況和堆疊尺寸大小活動時間表。 - 記錄的物件 Recorded Objects
顯示一張關於活動物件與陣列的圖表的活動時間表。 - 記錄的生產量 Recorded Throughput
顯示一段時間累計的JVM生產和釋放的活動時間表。 - 垃圾回收活動 GC Activity
顯示一張關於垃圾回收活動的活動時間表。 - 類 Classes
顯示一個與已裝載類的圖表的活動時間表。 - 執行緒 Threads
顯示一個與動態執行緒圖表的活動時間表。 - CPU負載 CPU Load
顯示一段時間中CPU的負載圖表。
3.3 使用心得
3.3.1 看記憶體圖
Key 1,把目光集中到上圖的藍色部分,可以發現每次記憶體上升到一個峰值之後便會下跌,這個動作其實就是GC在回收記憶體,並且上升和回收的幅度大抵相同,如果你發現記憶體圖中可用記憶體隨著時間的流逝一直在上升而沒有GC回收的動作,那麼你就要懷疑它是否存在著記憶體洩露了;
Key 2,當你懷疑記憶體洩露時,可以在Memory Views檢視Mark Current Values,然後在一段時間後F4,找出那個沒有被釋放掉的異常類對其進行深一步的追蹤;
Key 3,追蹤主要使用Heap Walker的各項功能,各功能具體能做何種分析請複習章節3.1直觀認識和3.2.2 堆遍歷 Heap Walker。