這些說明也許并不能完全滿足每種可能的部署環境――例如一個托管并運行Java server端組件的Java應用服務器。另外,現在市場上也有很多種Java 應用服務器。這份白皮書展示了一種經過驗證的有效方法來使用Rational PurifyPlus測試運行在Apache Jakarta Tomcat Version 4 服務器上的 JSP(Java ServePages)和 Java Servlet應用程序。類似的方法可以應用在商業性的Java 應用服務器上;許多運行在BEA WebLogic(版本5.1、6.0、6.1)和IBM WebSphere( 版本3.5 和 4)的J2EE應用程序都因此得到了"凈化"。
關于 Jakarta Tomcat
Jakarta是一個Sun公司支持的開源項目。它的最終目標是創造一個質量達到了那些商業解決方案要求的免費J2EE服務器端解決方案。Tomcat應用程序是整個項目的主要部分,并且在很多人看來,它幾乎就等同于整個的 Jakarta 項目。Tomcat并不是一個完整的Java 應用服務器,它只是一個 Servlet+JSP 引擎,不過用它來部署和測試 JSP 和 Java Servlet 應用程序是綽綽有余的。它既可以獨立運行,也可以集成在 Apache Web 服務器中運行。之所以選中 Tomcat 是因為它非常健壯、可靠,并可以免費獲取。更多的關于Tomcat和Jakarta項目的信息可在文檔末尾的參考文獻列表中找到,在參考文獻中列出的頁面同時還包括一個到Tomcat安裝程序和源代碼的URL地址。
關于 IBM Rational PurifyPlus
PurifyPlus是一個測試Java應用程序的完整解決方案。它包括三個應用程序:
Rational Purify -- 一個內存分析工具(收集方法和對象層次的內存分析數據,并指出應用程序的內存熱點所在)
Rational Quantify -- 一個應用程序執行時間分析工具(收集方法和線層次的分析數據并指出應用程序的性能瓶頸)
Rational PureCoverage -- 一個代碼覆蓋率分析工具(通過突出未執行的方法和代碼行來收集沒有測試到的部分的數據)
這三種工具不僅對Java,對Visual C/C++,Visual Basic和.Net應用也都提供了全面的支持。在這份白皮書中,Rational PurifyPlus指的是 Rational PurifyPlus 版本2001A。為了利用 Rational PurifyPlus來測試 Java Server端應用程序,您必須先在服務器上安裝它。
關于 Servlets 和 JavaServePages
Servlets是運行在服務器端的 Java 應用程序;它們的主要作用是根據客戶端的需要為Web頁面創建內容??蛻舳送ǔJ且粋€ Web 瀏覽器和一個用戶用來輸入數據的網頁,這些數據將由運行在服務器端的Servlet處理。而 Servlet 處理的結果則將顯示在客戶端的網頁上。
JavaServerPage(JSP) 基本上是一些 HTML 頁面,它們帶有一些特殊的標簽可以用來將 Java代碼包含進來或者訪問服務器端運行的 Java beans 和servlet。Rational PurifyPlus并不能檢查HTML語法,但它卻可以通過監控從JVM(JAVA 虛擬機)上收集到的事件來測試JSP中包含的Java部分。
準備利用Rational PurifyPlus進行測試的Java servlets和JavaServer Pages
PurifyPlus提供了兩種基本的數據收集級別: 方法級和行級。如果使用方法級來測試Java應用程序,您就不需要重編譯測試的Java程序來獲得所有和那些方法相關的數據。如果您對行級的信息感興趣,那您就得用Symbolic調試信息來重編譯Java代碼。在Sun的Java編譯器中用來得到Java類文件中的Symbols的開關是 '-g'。
>javac -g MyServlet.java
所有在兼容Sun Java2的虛擬機上運行的Java應用程序信息都可以通過JVMPI(Java Vitrul Machine Profiling Interface )收集。注意必須使用與Sun Java2 要求完全兼容的JAVA 虛擬機。Rational PurifyPlus 同時也完全支持 Microsoft Java 虛擬機。
在編譯 servlet 時您需要在 CLASSPATH 中包含 servlet 庫"servlet.jar"。整個庫文件是隨 Tomcat 一起安裝的,可以在目錄 <Tomcat home>\common\lib 中找到它。下面是一個使用 symbolic 調試信息來編譯 MyServlet.java 的命令行示例:
Javac -g -classpath <<Tomcat hom>\common\lib\servlet.jar>
MyServlet.java
準備 Windows 環境以便利用 Rational PurifyPlus 測試 JSP 和 Java Servlets
環境變量:
JAVA_HOME
指明了默認 JVM 的 home 目錄。它也是使用 Rational PurifyPlus 的JVM的默認選擇。為了正確安裝 Java 使得 PurifyPlus 可以運行,您必須在一個新的Java服務創建之后第一次profiling之前執行下面的命令行:
pstart<or qstart, or cstart> -setup
這個命令會更新選中的Java實時環境(JRE:Java Runtime Enviroment)的Java Policy文件?,F在來看另一個環境變量:
JAVA_OPTIONS(或者 IBM JVM 的 IBM_JAVA_OPTIONS )
Rational PurifyPlus 通過 Java 虛擬機假脫機接口(JVMPI)來收集所有關于Java應用程序的信息。因為JVM和Rational PurifyPlus是作為兩個不同的進程運行的,Java進程需要載入一個名為PureJVMPI的PurifyPlus共享文件來偵聽 JVM 事件,通過 JVMPI 收集運行數據。這個動態連接庫是通過一個運行Java可執行文件時的附加選項:'-Xrun'來加載的。這里有一個關于PurifyPlus如何從命令行啟動的例子:
>java -XrunPureJVMPI: Purify Java_App(或
>java -XrunPureJVMPI: Quantify Java_App(或
> java -XrunPureJVMPI: Coverage Java_App)
為了分析服務器端Java應用程序和服務,您需要手動創建一個特殊的包括"-Xrun"選項的系統參數,從而在每一次使用JAVA虛擬機時自動運行選中的PurifyPlus工具。對Sun JVM,整個變量的名稱是_JAVA_OPTIONS,它的值應該是:
-XRunPureJVMPI: Purify (or -XrunPureJVMPI:Quantify or -XrunPureJVMPI:Coverage)
如果您使用的的是IBM JVM(在運行IBM WebSphere Java應用服務器時必須選擇該JVM),那么整個環境變量的名字應該是 IBM_JAVA_OPTIONS.
在_JAVA_OPTIONS環境變量中設置的上述選項會使Tomcat應用程序運行時啟動Rational Purify(或者Quantify和PureCoverage),而Purify(或者Quantify和PureCoverage)則會自動的開始收集該Java進程的數據。您可以使它的報告不包含與測試的JSPs和Servlets無關的數據,具體方式是通過預濾器(pre-filter)或PurifyPlus的過濾管理器來實現的。
準備Java 應用服務器環境來運行Rational PurifyPlus
為了使PurifyPlus和Java應用服務器一起運行,必須為服務器和PurifyPlus工具指定相同的JAVA_HOME 參數。對Apache Tomcat,您可以直接執行下列命令:
SET JAVA_HOME = < path to JRE installation directory>
如果是BEA WebLogic 服務器或者IBM WebSphere,可以修改您用來安裝環境的批處理文件,只要根據如上所示改變參數JAVA_HOME的值就可以了。
準備PurifyPlus來收集在Apache Tomcat上運行的Java應用程序信息
為了使PurifyPlus可以收集在Apache Tomcat上運行的Java servlet或者JSP信息,您必須在開始測試之前創建一個自定義的預濾器(pre_filter)。
PurifyPlus過濾器。在PurifyPlus中有兩種途徑來過濾與測試無關的數據。第一種方法是為您要使用的工具(Rational PrufifyPlus、Quantify或PureCoverage)設定一個預濾器。
過濾器是一個列表,它包含了那些無需從中獲取數據的Java包的名字。整個列表在Profile.ini文件的[Prefilter]節定義,您可以在PurifyPlus工具的主目錄下找到該文件。
列表上的每個Java包都必須位于新行。請看一個演示預過濾在PurifyPlus中如何工作的例子:
圖1: 一個Rational PurifyPlus 的 Profile.ini文件
假設我們想要過濾Java包com.sun 。如果我們將 "com.sun."(請注意這里字符串末尾的點號)作為一行放到Profile.ini的pre-filetering部分,那么這個文件和它的所有子包都將在PruifyPlus進行數據收集時被排除在外(請看圖1)。如果要預過濾單個的類,您可以使用該類的全名(不需要結束的點號)。例如,com.rational.MyClass將預過濾com.rational包中的MyClass。如果您僅僅指明了類文件(e.g.MyClass),那么所有的包中的這個類都將被過濾掉。PurifyPlus不能過濾一個類的單個方法。
PurifyPlus過濾管理器。第二種方式是使用每一種工具的圖形用戶界面所提供的過濾管理器功能。過濾管理器為測試的Java應用程序創建一個特殊的二進制過濾文件(請看圖2A和圖2B)。它可以在profiling或者覆蓋數據收集到之后使用。
圖2A: Rational Quantify 中的PurifyPlus過濾管理器主窗口
在列表中選中的class文件將被排除在報告外,但從它們收集到的數據仍將保持在總的結果中。(也就是圖2A中右下角的"Time"選擇框)。
圖2B. 使用 Rational PureCoverage中的 Rationgal PurifyPlus過濾管理器
為了在PurifyPlus中運行Tomcat,我為各個PurifyPlus工具(Purify、Quantify、PureCoverage )推薦下列的預過濾器列表:
org.omg.
javax.servlet.
com.sun.
org.apache.
org.xml
org.w3c.
sun.
對于其他Java服務器應用程序,您需要創建其他的預過濾器。請看我的技術貼士:http://www.therationaledge.com/content/sep_01/t_techTips_gb.html,它說明了如何在BEA WebLogic和IBM WebSphere的Java 應用服務器上運行Rational PurifyPlus。
演示應用程序
這篇文檔用到的Demo程序是一個叫做"Duke's BookStore"的網上書店。這個Web應用程序可以在Sun的網站上下載。它原本是作為一個創建和運行Java servlet的指南的一部分而開發的。它包括一系列的Web頁面以及為這些頁面創建內容的servlet。Rational PurifyPlus可以用來測試這整個的Web應用程序或者它的一部分(比如說單個的servlet)。
在Rational PurifyPlus中對Java Serlets和JavaServerPages進行運行測試
在編譯了Java組件并為工具設定了必要的過濾器之后,您可以開始從Java servlet和JSP中收集行層次的分析和代碼覆蓋信息了。
對于第一步,我建議使用Rational PurifyPlus并收集執行時間分析數據。
用Ratioanl Quantify 分析應用程序執行時間
將值"_XrenPureJVMPI: Quantify"賦給環境變量_JAVA_OPTIONS會在Tomcat服務器啟動時激活Quantify。當你瀏覽演示程序時,Quantify會自動記錄執行Web頁上觸發的方法和代碼行所花費的時間。在Tomcat初始化并啟動之后,可以在瀏覽器中輸入如下的網址來訪問演示程序:
http://localhost:8080/bookstore/bookstore.html
在測試結束之后,關閉瀏覽器并停止Tomcat服務器應用程序。分析的結果可以在Quantify中以幾種不同的視圖顯示。第一種是CallGraph視圖,如圖3所示:
圖3. Rational Quantify一個Web應用程序的CallGraph視圖
CallGraph視圖高亮顯示了執行時消耗時間最多的調用鏈。粗體線條突出了應用程序中最慢的部分并表示了執行高亮顯示的方法時所耗費的時間在總運行時間中的百分比。
行層次的信息在所選方法的注釋源視圖(Annotated Source View)中包含,如圖4所示:
圖4: Rational Quantify 中Web應用程序中一個方法的注釋源視圖
更進一步的信息可以通過Quantify創建的其他視圖得到,包括圖5所示的函數細節視圖(Function Detail view)。
圖5. Web應用程序中一個方法的 Rational Quantify 函數細節視圖
Quantify相對于其他一些傳統的解決方案的優勢在于它表達分析性數據的方式。Quantify可以使您直接發現所測試應用程序的性能瓶頸的關鍵所在。
使用Rational PureCoverage進行代碼覆蓋
如果我們將_JAVA_OPTIONS環境變量改為"-XrunPrueJVMPI:Coverage"并重復對樣例Web應用程序的運行測試,PureCoverage就會記錄那些測試到的方法和代碼行,并高亮顯示那些沒有被測試到的部分。
如圖6A和圖6B所示,PureCoverage提供了關于所測試的Java servlets應用程序的method和line兩種級別的信息。
圖6A. Rational PureCoverage 對一個測試Web應用程序的方法覆蓋
在方法級覆蓋中,PureCoverage根據該方法所在的模塊或定義它的源文件來分類并提供被測試的應用程序的方法的相關統計數據。
關于被測試的應用程序的代碼行的信息顯示在加注的源代碼中;不同的顏色分別表示代碼選中,丟失,廢棄或部分選中。
圖6B. 測試的Web應用程序的一個servlet方法的 Rational PureCoverage line 級覆蓋
這類信息在設定運行時間測試的步驟或創建自動測試的腳本文件時非常有用。PureCoverage 同時也允許您合并對同一個應用程序歷次測試的覆蓋數據,從而提供對應用程序所實施的測試的質量的一個清晰的概觀。
利用Rational Purify進行內存分析
使用Rational Purify來獲取對所測試的Web應用程序的內存分析大體上類似于使用PureCoverage和Quantify。對運行中的應用程序進行內存使用情況的"快照"可以讓您在運行的不同階段對內存狀態進行比較。這是檢測內存泄漏的一個很有用的方法。
服務器應用程序(常常是全天候運行)的內存泄漏能很容易的使應用程序和系統同時崩潰,因為在運行過程中它會不斷地消耗越來越多的內存。內存泄漏對應用程序性能的影響也是巨大的。通過Rational Purify記錄的Java應用程序的內存狀態可以使您更深入地分析內存的使用狀況。
Purify在對Java Servlet和JSP進行測試時提供的報告類型和它在測試Java 應用程序與Java applets時是一樣的。圖7顯示了一個Purify記錄一個接受測試的JSP如何調用JavaBean 方法。
圖7: Demo JSP的 Rational Purify Call Graph
如圖8中所示,在方法列表中提供了更多有關JSP 會話的內存使用信息。
圖8. JSP的 Rational Purify 函數列表
與Rational Purify引導用戶發現應用程序中消耗最多執行時間的部分類似,Purify向用戶指出了應用程序的內存瓶頸所在。通過對函數列表視圖中的方法進行排序可以很容易找到那些消耗了過多內存的方法;Purify同時還提供了很多其他視圖來幫助您做到這一點。
用最少的投入獲得最大的產出
在服務器機器上部署Rational Quantfify來獲得 Java 服務器側應用程序的廣泛分析和代碼覆蓋率的數據是非常輕松的。您不但可以將Rational PurifyPlus應用在商業性的Java server應用程序上,同時也可以在輕量級的免費Java Servlets和JSP引擎(比如Apache Tomcat)上使用它。
原文轉自:http://www.anti-gravitydesign.com