日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK14的新特性:JFR,JMC和JFR事件流

發布時間:2024/2/28 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK14的新特性:JFR,JMC和JFR事件流 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • JFR
  • JMC
    • 創建JFR
    • 分析JFR
  • JFR事件
  • JFR事件流
  • 總結

簡介

Java Flight Recorder(JFR)是JVM的診斷和性能分析工具。它可以收集有關JVM以及在其上運行的Java應用程序的數據。JFR是集成到JVM中的,所以JFR對JVM的性能影響非常小,我們可以放心的使用它。

一般來說,在使用默認配置的時候,性能影響要小于1%。

JFR的歷史很久遠了。早在Oracle2008年收購BEA的時候就有了。JFR一般和JMC(Java Mission Control)協同工作。

JFR是一個基于事件的低開銷的分析引擎,具有高性能的后端,可以以二進制格式編寫事件,而JMC是一個GUI工具,用于檢查JFR創建的數據文件。

這些工具最早是在BEA的JRockit JVM中出現的,最后被移植到了Oracle JDK。最開始JFR是商用版本,但是在JDK11的時候,JFR和JMC完全開源了,這意味著我們在非商用的情況下也可以使用了。

而在今天的JDK 14中,引入了一個新的JFR特性叫做JFR Event Streaming,我們將在本文中詳細講解。

先介紹一下JFR和JMC。

更多內容請訪問www.flydean.com

JFR

上面我們簡單的介紹了一下JFR。JFR是JVM的調優工具,通過不停的收集JVM和java應用程序中的各種事件,從而為后續的JMC分析提供數據。

Event是由三部分組成的:時間戳,事件名和數據。同時JFR也會處理三種類型的Event:持續一段時間的Event,立刻觸發的Event和抽樣的Event。

為了保證性能的最新影響,在使用JFR的時候,請選擇你需要的事件類型。

JFR從JVM中搜集到Event之后,會將其寫入一個小的thread-local緩存中,然后刷新到一個全局的內存緩存中,最后將緩存中的數據寫到磁盤中去。

或者你可以配置JFR不寫到磁盤中去,但是這樣緩存中只會保存部分events的信息。這也是為什么會有JDK14 JEP 349的原因。

開啟JFR有很多種方式,這里我們關注下面兩種:

  • 添加命令行參數
  • -XX:StartFlightRecording:<options>

    啟動命令行參數的格式如上所述。

    JFR可以獲取超過一百種不同類型的元數據。如果要我們一個個來指定這些元數據,將會是一個非常大的功能。所以JDK已經為我們提供了兩個默認的profile:default.jfc and profile.jfc。

    其中 default.jfc 是默認的記錄等級,對JVM性能影響不大,適合普通的,大部分應用程序。而profile.jfc包含了更多的細節,對性能影響會更多一些。

    如果你不想使用默認的兩個jfc文件,也可以按照你自己的需要來創建。

    下面看一個更加完整的命令行參數:

    -XX:StartFlightRecording:disk=true,filename=/tmp/customer.jfr,maxage=5h,settings=profile

    上面的命令會創建一個最大age是5h的profile信息文件。

  • 使用jcmd
  • 命令行添加參數還是太麻煩了,如果我們想動態添加JFR,則可以使用jcmd命令。

    jcmd <pid> JFR.start name=custProfile settings=default jcmd <pid> JFR.dump filename=custProfile.jfr jcmd <pid> JFR.stop

    上面的命令在一個運行中的JVM中啟動了JFR,并將統計結果dump到了文件中。

    上面的custProfile.jfr是一個二進制文件,為了對其進行分析,我們需要和JFR配套的工具JMC。

    JMC

    JDK Mission Control 是一個用于對 Java 應用程序進行管理、監視、概要分析和故障排除的工具套件。

    在JDK14中,JMC是獨立于JDK單獨發行的。我們可以下載之后進行安裝。

    我們先啟動一個程序,用于做JFR的測試。

    @Slf4j public class ThreadTest {public static void main(String[] args) {ExecutorService executorService= Executors.newFixedThreadPool(10);Runnable runnable= ()->{while(true){log.info(Thread.currentThread().getName());try {Thread.sleep(500);} catch (InterruptedException e) {log.error(e.getMessage(),e);}}};for(int i=0; i<10; i++){executorService.submit(runnable);}} }

    很簡單的一個程序,啟動了10個線程,我們啟動這個程序。

    然后再去看看JMC的界面:

    我們可以看到在界面的左邊已經可以看到運行在本機的ThreadTest程序了。

    點擊MBean服務器,可以看到該java程序的面板信息,里面包含CPU,堆棧信息。

    在下面有7個tab分別是概覽,MBean瀏覽器,觸發器,系統,內存,線程,和診斷命令。

    通過下面的tab我們可以獲得更加詳細的java程序的信息,并且通過觸發器和診斷命令,我們還可以對目標java程序的JVM發送命令。

    JMC非常強大,也有很多功能,具體的細節大家可以自己運行去體會。

    因為本文主要是將JFR,下面我們將講解如何在JMC中創建JFR和分析JFR。

    創建JFR

    上面右側的MBean服務器下就是飛行記錄器了,也就是我們的目標。

    點擊飛行記錄器:

    我們就可以開始創建一個JFR了。

    目標文件就是JFR的生成地址,名稱可以自己隨便起一個,記錄時間表示需要記錄多長時間范圍之內的JFR。

    點下一步:

    這一步可以選擇更加詳細的JVM參數。

    點下一步:

    這里,我們可以選擇需要監控的Profile事件選項。可以按照你的需要進行選擇。

    最后點完成創建JFR。

    分析JFR

    上面我們的JFR記錄了1分鐘的Profile,在1分鐘之后,我們可以看到目標JFR文件生成了。

    生成完JFR之后,JMC會自動打開生成的JFR文件,我們得到一個大綱視圖。

    里面包含java應用程序,JVM內部,環境和事件瀏覽器。

    事件瀏覽器中列出了我們在1分鐘之內監控的事件。

    JMC瀏覽器不僅可以監控本機的應用程序,也可以監控遠程的應用程序。由于JMC的連接是通過JMX協議,所以遠程java程序需要開啟JMX協議的支持。

    JFR事件

    JMC好用是好用,但是要一個一個的去監聽JFR文件會很繁瑣。接下來我們來介紹一下怎么采用寫代碼的方式來監聽JFR事件。

    還是上面的圖,如果我們想通過程序來獲取“Class Loading Statistics"的信息,可以這樣做。

    上圖的右側是具體的信息,我們可以看到主要包含三個字段:開始時間,Loaded Class Count和 Unloaded Class Count。

    我們的思路就是使用jdk.jfr.consumer.RecordingFile去讀取生成的JFR文件,然后對文件中的數據進行解析。

    相應代碼如下:

    @Slf4j public class JFREvent {private static Predicate<RecordedEvent> testMaker(String s) {return e -> e.getEventType().getName().startsWith(s);}private static final Map<Predicate<RecordedEvent>,Function<RecordedEvent, Map<String, String>>> mappers =Map.of(testMaker("jdk.ClassLoadingStatistics"),ev -> Map.of("start", ""+ ev.getStartTime(),"Loaded Class Count",""+ ev.getLong("loadedClassCount"),"Unloaded Class Count", ""+ ev.getLong("unloadedClassCount")));@Testpublic void readJFRFile() throws IOException {RecordingFile recordingFile = new RecordingFile(Paths.get("/Users/flydean/flight_recording_1401comflydeaneventstreamThreadTest21710.jfr"));while (recordingFile.hasMoreEvents()) {var event = recordingFile.readEvent();if (event != null) {var details = convertEvent(event);if (details == null) {// details為空} else {// 打印目標log.info("{}",details);}}}}public Map<String, String> convertEvent(final RecordedEvent e) {for (var ent : mappers.entrySet()) {if (ent.getKey().test(e)) {return ent.getValue().apply(e);}}return null;} }

    注意,在convertEvent方法中,我們將從文件中讀取的Event轉換成了map對象。

    在構建map時,我們先判斷Event的名字是不是我們所需要的jdk.ClassLoadingStatistics,然后將Event中其他的字段進行轉換。最后輸出。

    運行結果:

    {start=2020-04-29T02:18:41.770618136Z, Loaded Class Count=2861, Unloaded Class Count=0} ...

    可以看到輸出結果和界面上面是一樣的。

    JFR事件流

    講了這么多,終于到我們今天要講的內容了:JFR事件流。

    上面的JFR事件中,我們需要去讀取JFR文件,進行分析。但是文件是死的,人是活的,每次分析都需要先生成JFR文件簡直是太復雜了。是個程序員都不能容忍。

    在JFR事件流中,我們可以監聽Event的變化,從而在程序中進行相應的處理。這樣不需要生成JFR文件也可以監聽事件變化。

    public static void main(String[] args) throws IOException, ParseException {//default or profile 兩個默認的profiling configuration filesConfiguration config = Configuration.getConfiguration("default");try (var es = new RecordingStream(config)) {es.onEvent("jdk.GarbageCollection", System.out::println);es.onEvent("jdk.CPULoad", System.out::println);es.onEvent("jdk.JVMInformation", System.out::println);es.setMaxAge(Duration.ofSeconds(10));es.start();}}

    看看上面的例子。我們通過Configuration.getConfiguration(“default”)獲取到了默認的default配置。

    然后通過構建了default的RecordingStream。通過onEvent
    方法,我們對相應的Event進行處理。

    總結

    本文講解了JFR,JMC和JDK14的最新特性JFR event stream。希望能夠對大家在工作中有所幫助。

    本文的例子https://github.com/ddean2009/learn-java-base-9-to-20

    更多精彩內容且看:

    • 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
    • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
    • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
    • java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程

    本文作者:flydean程序那些事

    本文鏈接:http://www.flydean.com/jdk14-jfr-jmc-event-stream/

    本文來源:flydean的博客

    歡迎關注我的公眾號:程序那些事,更多精彩等著您!

    超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

    總結

    以上是生活随笔為你收集整理的JDK14的新特性:JFR,JMC和JFR事件流的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。