JProfiler入門教程-簡單的java程序性能調優

推薦文章:JProfiler 入門教程

一、安裝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對象被釋放掉了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章