A. 如何集成Perf4j到java應用程序中並生成性能數據
在實際部署的生產環境能夠以較低的風險及成本實現對業務邏輯級別性能問題的追蹤。本文將介紹如何集成 Perf4j 到 Java 應用程序中並生成性能數據。
系統日誌是應用程序問題診斷及運行維護的重要工具。Logback、Log4j 是常用於 Java 平台的日誌記錄 API. 目前大部分產品只是將系統重要參數、狀態的變化及異常信息通過日誌輸出。本文將要介紹的 Perf4j 是一款專
門用於 Java 伺服器端代碼計時、記錄日誌和監控結果的開源工具包。Perf4j
對常用日誌工具包進行了擴展,能夠將得到的原始性能數據進行統計並發布到可定製的輸出源,如控制台、日誌文件、JMX 等。Perf4j
提供了多種方式與 Java 代碼集成,開發和系統維人員能夠靈活地將 Perf4j 的 API 嵌入到各種不同架構的應用程序中。
Perf4j 目前依託於開源項目協作平台 Codehaus 進行文檔及代碼管理,下一步該項目計劃遷移到 Github
平台,以便更多的社區及開發人員可以參與到開發及維護中來。Perf4j 歡迎使用者提出新的功能需求並且鼓勵將定製或擴展的代碼貢獻到 Perf4j
源碼中。本文中示例代碼使用的 Perf4j 版本是 0.9.16,讀者需在下載類包或配置 Maven 時留意。
閱讀文章之前,您要對 Java 註解、JMX、面向方面編程有一些了解。特別是 JConsole 的使用及 Spring AOP 的配置方式要較為熟悉。
文章首先闡明在何種應用場景下應優先考慮使用 Perf4j。然後是具體講解 Pef4j 與應用程序的集成方式。最後會介紹如何將收集的數據生成便於分析的可視化圖表。
應用場景
在 Java 平台上遇到性能問題時,如 CPU 佔用過高、系統響應緩慢,通常的分析方法是使用 JVM
剖析工具在系統瓶頸臨界點前一段時間抓取 CPU 佔用分布,再對 CPU 佔用率最高的幾個方法排查。Perf4j
的優勢在於能夠持續跟蹤統計所關注功能代碼的執行效率,對於前後兩個版本出現較大差異的方法進行深入分析,可以在開發周期中盡早發現問題。Perf4j 還可以用在產品環境中,從運營的早期開始,將其統計的數據做為系統的性能和健康指標長期監測。
首選 Perf4j 的應用場景:
Java 本地代碼調用(JNI) 分布式系統、集群部署 面向服務體系結構(SOA) 遠程方法調用(RMI)
開發人員必須將本地方法、遠程方法及 Web services 的性能問題隔離出來,以防干擾對 Java 應用程序本身的分析。通過日誌記錄則是最簡單的方式;採用分布式架構或集群部署的系統相對復雜,不同的網路環境、基礎硬體和操作系統的差異、虛擬主機中資源與配置的差異等造成很難採用統一的工具來監測代碼級別的性能指標。而日誌記錄則可以輕松加入到各種程序中,且是資源與時間成本最低的方式。Perf4j 提供了 CSV 格式的轉換工具,開發人員可以藉助第三方工具方便地將統計結果匯總分析。
集成到應用程序
下面將分兩種方式具體講述如何利用 Per4j 提供的 API。在實際的項目中,應根據現有的程序框架及監測目的靈活選擇。另外,針對 WebSphere 應用伺服器的自有日誌系統,還必須採取額外的措施來確保 Perf4j 的正常工作。
對代碼段計時
Perf4j 中 org.perf4j.StopWatch 是整個 API 中的基礎工具。這是一個封裝良好的計時器。可以把
StopWatch 嵌入到代碼中任何地方。這種方式往往使得復雜的方法得到分解,從而有利於精確定位問題的根源。以下通過清單 1 和清單 2
來介紹其具體用法。
清單 1.StopWacth 基本用法
public static void basicStopWatch() throws
InterruptedException{ // 創建 StopWacth 時開始計時,之後也可以用 stopWatch.start()
重新設定計時開始時間點 StopWatch stopWatch = new StopWatch("TransactionA"); //
執行需要計時的代碼 Thread.sleep(2 * 1000L); String result = stopWatch.stop();
System.out.print(result); }
清單 1 中最後輸出的結果示例:start[1340442785756] time[1995]
tag[TransactionA]。在構造函數中設定 tag[TransactionA]
用來區分不同的業務邏輯,可以把它看成是性能分析中的事務(Transaction)。
如果需要將多段代碼分開統計,可採用 LoggingStopWatch 類的 lap() 方法定義多個事務。
清單 2.LoggingStopWatch 用法
public static void loggingStopWacth()
throws InterruptedException{ LoggingStopWatch stopWatch = new
LoggingStopWatch(); // 設定閾值,小於此閾值的結果將不會被記錄下來
stopWatch.setTimeThreshold(1*1000L); Thread.sleep(2 * 1000L); //
停止當前計時,開始新的起始時間點 stopWatch.lap("TransactionB"); Thread.sleep(500L);
stopWatch.stop("TransactionC"); }
清單 2 中使用了 LoggingStopWatch 類,其 stop() 方法只是將執行時間數據通過
System.err.println() 輸出。若與 Log4j 框架集成,則需要使用 LoggingStopWatch 的子類
Log4JStopWatch, 目前 Perf4j 還支持 Apache Commons
Logging、java.util.logginLogback,對應使用 CommonsLogStopWatch、
JavaLogStopWatch、Slf4JStopWatch。
B. java pinyin4j 多音字怎麼辦
漢字轉化成拼音,返回的是一個String[] 。
就是多音字所有的拼音。
怎麼辦?
那麼隨便取一個,要麼設置拼音顯示不帶聲調。只能這么辦了。。
C. java linq4j 效率怎麼樣
Linq4j實現了標准Linq的絕大多數功能,同時利用Expression類簡化了很多簡單函數的實現。使用起來還是很方便的,但我沒有時間做具體的性能測試,因此在性能上沒有發言權。但不論如何,膜拜一下作者的技術水平。如果大家有空,可以看看linq4j的源碼,一定會有很多收獲。
集合操作是應用開發中最普遍的開發情形,可惜JAVA本身在該處並無太大建樹,linq4j能不能用在大型項目上很難說,如果能在語言本身享受這種便利,那是最好不過的了,.NET系同學應該感到幸福。我們只能期待JAVA8帶來的lamda表達式新特性,能更好的解決這個問題,當然這只能在2014年了。
為了方便那些不用maven的同學,附件加上linq4j的jar包下載。 注意下載後改後綴名為jar.
D. 誰知道java開源中的4j的全稱或意思啊,比如log4j,wss4j啊,最後的4j是是什麼意思
英文 for Java的諧音縮寫