一、安裝JProfiler
從http://www.ej-technologies.com/下載下傳5.1.2并申請試用序列号
二、主要功能簡介
1.記憶體剖析 Memory profiler
JProfiler 的記憶體視圖部分可以提供動态的記憶體使用狀況更新視圖和顯示關于記憶體配置設定狀況資訊的視圖。所有的視圖都有幾個聚集層并且能夠顯示現有存在的對象和作為垃圾回收的對象。
-
所有對象
顯示類或在狀況統計和尺碼資訊堆上所有對象的包。你可以标記目前值并顯示差異值。
-
記錄對象 Record objects
顯示類或所有已記錄對象的包。你可以标記出目前值并且顯示差異值。
-
配置設定通路樹 Allocation call tree
顯示一棵請求樹或者方法、類、包或對已選擇類有帶注釋的配置設定資訊的J2EE元件。
-
配置設定熱點 Allocation hot spots
顯示一個清單,包括方法、類、包或配置設定已選類的J2EE元件。你可以标注目前值并且顯示差異值。對于每個熱點都可以顯示它的跟蹤記錄樹。
2.堆周遊 Heap walker
在JProfiler的堆周遊器(Heap walker)中,你可以對堆的狀況進行快照并且可以通過選擇步驟下尋找感興趣的對象。堆周遊器有五個視圖:
-
類 Classes
顯示所有類和它們的執行個體。
-
配置設定 Allocations
為所有記錄對象顯示配置設定樹和配置設定熱點。
-
索引 References
為單個對象和“顯示到垃圾回收根目錄的路徑”提供索引圖的顯示功能。還能提供合并輸入視圖和輸出視圖的功能。
-
資料 Data
為單個對象顯示執行個體和類資料。
-
時間 Time
顯示一個對已記錄對象的解決時間的柱狀圖。
3. CPU 剖析 CPU profiler
JProfiler 提供不同的方法來記錄通路樹以優化性能和細節。線程或者線程組以及線程狀況可以被所有的視圖選擇。所有的視圖都可以聚集到方法、類、包或J2EE元件等不同層上。CPU視圖部分包括:
-
通路樹 Call tree
顯示一個積累的自頂向下的樹,樹中包含所有在JVM中已記錄的通路隊列。JDBC,JMS和JNDI服務請求都被注釋在請求樹中。請求樹可以根據Servlet和JSP對URL的不同需要進行拆分。
-
熱點 Hot spots
顯示消耗時間最多的方法的清單。對每個熱點都能夠顯示回溯樹。該熱點可以按照方法請求,JDBC,JMS和JNDI服務請求以及按照URL請求來進行計算。
-
通路圖 Call graph
顯示一個從已選方法、類、包或J2EE元件開始的通路隊列的圖。
4. 線程剖析 Thread profiler
對線程剖析,JProfiler提供以下視圖:
-
線程曆史 Thread history
顯示一個與線程活動和線程狀态在一起的活動時間表。
-
線程監控 Thread monitor
顯示一個清單,包括所有的活動線程以及它們目前的活動狀況。
-
死鎖探測圖表 Deadlock Detection
顯示一個包含了所有在JVM裡的死鎖圖表。
-
目前使用的監測器 Current monitor useage
顯示目前使用的監測器并且包括它們的關聯線程。
-
曆史檢測記錄 History usage history
顯示重大的等待事件和阻塞事件的曆史記錄。
-
監測使用狀态 Monitor usage statistics
顯示分組監測,線程和監測類的統計監測資料。
5.VM 遙感勘測技術 VM telemetry
觀察JVM的内部狀态,JProfiler提供了不同的遙感勘測視圖,如下所示:
-
堆 Heap
顯示一個堆的使用狀況和堆尺寸大小活動時間表。
-
記錄的對象 Recorded objects
顯示一張關于活動對象與數組的圖表的活動時間表。
-
垃圾回收 Garbage collector
顯示一張關于垃圾回收活動的活動時間表。
-
類 Classes
顯示一個與已裝載類的圖表的活動時間表。
-
線程 Threads
顯示一個與動态線程圖表的活動時間表。
三、實戰
(一)任務目标
找出項目中記憶體增大的原因
(二)配置說明
作業系統:Windows2003
Web容器:Tomcat5.0.23
JDK版本:sun1.4.2
監控類型:本地
Jprofiler安裝路徑:D:/jprofiler5
Tomcat安裝路徑:D:/Tomcat5
(三) 測試項目
1. 建立WEB項目test
2. 建包cn.test
3. 在該包下建類檔案TestMain.java 和 TestBean.java
package cn.test;
public class TestBean {
String name = "";
}
package cn.test;
import java.util.ArrayList;
publicclass TestMain {
publicstatic ArrayList list = new ArrayList(); //存放對象的容器
public static int counter = 0; //作統計用
}
4.建測試用的JSP檔案init1.jsp、init2.jsp
Init1.jsp(每次執行都建立1萬個TestBean對象)
<%@ page language="java" import="cn.test.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>init</title>
</head>
<body><%
for(int i=0;i<10000;i++){
TestBean b = new TestBean();
TestMain.list.add(b);
}
%>
SIZE:<%=TestMain.list.size()%><br/>
counter:<%=TestMain.counter++%>
</body>
</html>
Init2.jsp和init1.jsp一模一樣即可(後面有用)。
(四) 配置測試用例
1. 點選d:/jprofiler5/bin/jprofiler.exe
2. 執行菜單SessionàIntegration WizardsàNew ServerIntegration
選擇是本地測試還是遠端測試:
選擇tomcat運作的腳本檔案:
選擇虛拟機的類型:
選擇監控端口:
用預設的即可
選擇Web容器是否和Jprofiler一起運作:
預設即可
配置提示:
在“遠端控制”的時侯要仔細閱讀一下。
然後選擇立即起動,開始運作。
點選“OK”,我們可以看到另外一個小視窗出來了:
Jprofiler的視窗為:
這樣我們就可以進行監控了!
(五) 開始測試
1. 在IE位址欄中輸入:http://localhost/test/init1.jsp,執行一次,我們可以在記憶體視圖中看到cn.test.TestBean對象被建立了10000次:
2.标記現在的狀态,然後再執行init1.jsp和,init2.jsp可以讓我們找到哪些類在調用後沒有被釋放(很重要!!!)
檢視哪些類被發生了變化:
紅色的變成是發生變化的對象及其數量。
我剛才執行了4次init1.jsp和1次init2.jsp,正好産生了50000個TestBean對象,和圖示顯示的一樣。
3. 過一會後,按F4鍵進行垃圾回收。但回收完成後,這些對象依然存在,說明某些地方對這個類的引用沒有被釋放!
4. 找出是哪些地方使用了TestBean類,并且沒有釋放它們
在cn.test.TestBean對象上點選右鍵選擇“Take Heap Snapshot for Selection”,觀察它的heap
下一步:
點選“OK”:
在該類中點選右鍵,在出現的菜單中選擇“Use Selected Objects”:
出現如下視窗:
選擇”Allocations”,點選“OK”,然後我們要的結果就出來了
圖中顯示調用此類的地方是init1.jsp和init2.jsp,并且各自占用的比率都列出來了。
既然問題的所在找出來了,接下來就該去解決問題了!
(五)總結
其實,我們在測試記憶體占用時還可以另外寫一個釋放記憶體的JSP檔案來配合測試,會更清楚一些:
Free.sjp
<%@ page language="java" import="java.util.*,cn.test.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>init</title>
</head>
<body>
<%TestMain.list.clear(); %> collection OK!
</body>
</html>
在點選完init1.jsp或init2.jsp後,可以看到記憶體是TestBean對象的數量增加了,然後執行free.sjp,接着再執行F4進行垃圾回收,立刻可以看到TestBean對象被釋放掉了。
參考文檔位址:
http://www.blogjava.net/anymobile/articles/28248.html