如果想分析Java應用,有很多工具可供選擇——但你想過分析應用可以像添加日誌那麼簡單麼?這就是Perf4j項目的目標所在:
如同log4j類似於System.out.println()一樣,Perf4J類似於System.currentTimeMillis()。
Perf4J提供的很多特性都令人耳目一新:
- 用於計時的簡單的停止觀測(stop watch)機制。
- 用於解析日誌文件的命令行工具,可以生成聚合統計和性能圖表
- 輕鬆集成大多數常見的日誌框架和門面:log4j、java.util.logging、Apache Commons Logging及SLF4J.
- 客戶化的log4j appenders,可以在應用運行時生成統計和圖表(不久還會提供客戶化的 java.util.logging處理器)。
- 可以將性能統計暴露爲JMX屬性,當統計超出指定極限時發送通知。
- 用於展現Web應用性能圖表的Servlet。
- 提供了@Profiled註解和一套客戶化的方面(aspect),在處理AOP框架如AspectJ或Spring AOP時可以靈活插入計時語句。
- 可擴展的架構
InfoQ有幸採訪了Perf4j項目的領導者Alex Devine,他談到了開發Perf4j的緣由:
在認識到性能跟蹤和管理問題會嚴重影響到公司的每個項目(事實上會影響到幾乎所有的基於服務器的、分佈式應用)後,我們決定構建並開發一個標準的性能庫,最後就誕生了Perf4J。
“Perf4j能解決哪些特殊的性能問題呢”?
Perf4J非常適合於分佈式、面向服務的應用的性能問題跟蹤。例如,用戶點擊Homeaway上的某個搜索頁面後就會發出對Web服務器的一個調用,該Web服務器又會調用數據庫,同時還會通過HTTP調用搜索服務和廣告服務器。搜索服務本身會將各個搜索結點生成的結果聚合起來。如果在產品環境下性能出現了問題,我們可以通過Perf4j輕鬆快速的查明出問題的組件。
這導致了另一個問題“Perf4j可以用在產品環境中麼?”
Perf4J明確定位於產品環境中。事實上,很多時候在每個階段上一切都很好,但放到了產品環境下就會出現各種問題,在出現大的性能問題前就提早做好準備對於問題的跟蹤是大有裨益的。
對於性能開銷,Alex說到:
其開銷與日誌類似,就像在代碼前後使用System.currentTimeMillis()並記錄日誌一樣,你可以在通過開始和停止StopWatch來實現這一切。這樣類似於日誌,其花費最終取決於附加的appenders。AsyncCoalescingStatisticsAppender僅是將日誌消息壓入到隊列中並由單獨線程中downstread appenders的取出,這樣當這些appenders完成處理後不會影響到主線程的執行時間。此外,如果通過加載時間(load-time)來使用@Profiled註解,你可以定義運行中所分析的方法,在這種情況下,那些不做分析的方法就無需任何額外的設置。
關於未來Alex說到:
我們想對那些沒有StopWatch或@Profiled註解的方法也進行運行時分析。也就是說開發者可以在aop.xml或Spring配置文件中指定要分析的方法。這樣就可以分析第三方庫(他們並不知道Perf4J),而且無需在源代碼中使用分析語句了。
可以從 http://perf4j.org下載Perf4j。