在今年的JAX London上,來自甲骨文Java平台組的Ola Westin介紹了Java任務控制(Java Mission Control,JMC)和Java飛行記錄器(Java Flight Recorder,JFR)的功能。
Westin首先在整體上介紹了JMC和JFR,然後為觀眾展示了如何創建和分析記錄(recording)並為觀眾提供了一個樣例。在本文中,InfoQ將會帶領讀者回顧Westin的演講。
Java任務控制概覽
Java任務控制是一個圖形化的界面,它借助JMX控制台(提供了服務器的原始視圖)和Java飛行記錄器(Java Flight Recorder)(收集、分析和診斷應用的數據)的幫助,能夠可視化Java虛擬機(Java VM)的行為。
JMC(jmc命令)打包在了Java開發工具集中(JDK),位於bin目錄下。額外的日志可以通過使用 –consoleLog –debug
選項來啟用。各種體驗式的插件(比如針對DTrace、JMX控制台的插件)也可以進行在JMC中進行下載。
Java飛行記錄器概覽
Java飛行記錄器會收集Java應用程序以及Java VM的行為信息。JFR構建在了Java VM之中,能夠為用戶提供運行時的信息。使用JFR並不會影響其他的Java VM優化,它的最小開銷會小於2%。
JFR有不同的事件,比如即時事件(instant event)、持續事件(duration event)以及可請求事件(request-able event)。即時事件只會在某個時間點發生(比如線程啟動),因此它的開銷最小,但是持續事件(如垃圾收集等)是基於阈值的,與之類似,可請求事件(比如方法分析采樣)基於可配置的時間段,因此這些事件的開銷差異很大。
JFR的采樣性能分析器並不需要線程處於安全點上,也不會記錄每個方法的調用(它只會探測熱點方法)。按照該演講所述,對於調用原生方法的線程,並沒有與之相關的采樣。
有兩種不同類型的記錄:固定時間(性能分析)的記錄以及持續的記錄,它們都會dump到一個文件中。
創建記錄
要使用JFR來創建記錄,我們需要在啟動JVM的時候添加如下的命令行選項:-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
從Java 8 update 40開始,我們還可以在運行時通過JMC或者jcmd
方案來創建JFR記錄。
如下的三幅圖片分別展現了如何利用上述的三種方案來創建JFR記錄。
我們還可以按照下圖的方式記錄遠程的系統:
分析記錄
在演講中,Westin強調在進行任何的深入調查之前,提出正確問題是非常重要的。接下來他給出了一個樣例,這個樣例闡述了“熱點方法”的問題,如下所示:
在這裡,當“Hot Methods” tab選中的時候,我們可以看到LinkedList.indexOf(Object)占據了總采樣數量的97.35%。在深入研究調用棧的時候,我們發現在鏈式列表中有一個contains(Object)方法,這個方法需要O(n)的迭代。為了解決這個問題,Westin運行了另外一個JFR記錄,將LinkedList替換為HashSet,它的結果如下所示:
隨後,Westin又介紹了兩個樣例:其中一個是關於線程競爭的,另一個是因為自動裝箱所導致的內存分配。最後,他進行了總結展望,相關的slide如下所示:
查看英文原文:JAX London: Production Time Profiling Using Java Flight Recorder