歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

JAX London:使用Java飛行記錄器實現生產環境的性能分析

在今年的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

Copyright © Linux教程網 All Rights Reserved