2010-03-12 45 views
4

進行Servlet概要分析的最佳方法是什麼?Servlet概要分析

特別是我正在尋找一個解決方案,可以顯示servlet中方法調用的執行時間。

我在Tomcat環境中運行Servlet。

我已經嘗試過VisualVM,但它只允許我從Tomcat線程而不是Servlet本身查看方法調用。

+0

LambdaProbe很容易集成到Tomcat。它顯示了servlet執行次數,最小/最大時間以及內存中的會話屬性和大小。 但它不會做你想看到的個別方法調用。 JProbe和JProfiler都很有用 - 兩者都是商業產品 – JoseK 2010-03-12 06:47:53

回答

2

我使用JProfiler進行分析,它們支持許多不同的服務器,並提供非常好的控制和良好的報告。但是它是一個商業應用程序,雖然你可以得到一個評估版本。你也可以看看open source profilers,雖然我沒有使用過這些,也不能說它們有多好或壞。

編輯 我假定您瞭解如何剖析作品,剖析會做一些儀器和附加代理的JVM,這一切都影響性能。所以永遠不要在生產環境中使用它。

1

爲什麼你不使用JConsole - 這暴露MBeans。您的容器應用程序可能會公開一些與您的servlet相關的有用字段 - 如果不是,您可以創建自己的MBean。

3

手動解決這個問題的方法可能是爲有問題的servlet創建一個過濾器,然後可以測量完成所有執行並將它們存儲在某處的時間。 這很好,因爲分析調用的開銷與您在過濾器中編寫的代碼一樣多,我還發現找到需要更長時間才能完全加載的頁面和servlet非常有用。

這是過濾器是如何工作的

  • 網址被稱爲
  • 過濾器進入並存儲了一個名爲URL和當前時間(開始時間)
  • 過濾器調用目的地的servlet(S)
  • Servlet的執行(的servlet ,頁面或jsp)
  • 控制返回到過濾執行時間是:currentTime - startTime
  • 記錄或存儲對於未來comparisson獲得的數據(即其存儲到一個CSV文件)
  • 過濾器端部

這樣做創建一個實現了javax.servlet.Filter接口的類。

public class ProfilingFilter implements Filter { 
    public void init(FilterConfig fc){} 
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain){ 
    long startTime = System.currentTimeInMillis(); 
    String servletName = ((HttpServletRequest) req)..getPathInfo(); 
    chain.doFilter(req, resp); 
    long executionTime = System.currentTimeInMillis()-startTime; 
    // Implement the following to store or handle the data. 
    logData(servletName, executionTime); 
    } 
} 

現在把它添加到你的web.xml

​​

最後的映射:

<filter-mapping> 
    <filter-name>profilingFilter</filter-name> 
    <url-pattern>*</url-pattern> 
</filter-mapping> 

注意,這將會過濾一切,所以你會簡介,HTML,JSP, servlets,圖像,還有什麼不是。

我們發現這非常有用,可以發現應用程序中確切需要花費太多時間來響應或者非常沉重。

您甚至可以在生產中使用此功能以獲取真實數據,性能上的突破將與您的代碼保存分析數據一樣大。

一些想法:存儲您的統計地圖的servlet上下文裏面,然後讓另一個servlet顯示這些統計數據。這樣你甚至不需要訪問磁盤。

1

2015. 由於JDK 7u60(如果我知道了)jvm有一個內置工具來分析java應用程序。據說它非常輕便~1%的CPU消耗。 它被稱爲Java飛行記錄器。 要啓用它,您需要7u60的jdk版本,並使用以下標誌啓動您的應用程序。

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr 

這裏duration=60s將分析的時間(設定爲多,因爲你需要),並filename=myrecording.jfr設置到分析信息將被保存的文件。

然後你可以使用java任務控制來查看文件。

Video here

Docs here