摘要:序本文主要研究一下的使用。執行順序的話,先再,最后。內置了相關,可以用來解析文件,也可以在應用程序自定義事件發布出來可以采用命令啟動,也可以使用的開頭的命令在運行時操作,非常方便
序
本文主要研究一下Java Flight Recorder的使用。
命令主要有5個命令,configure、check、start、dump、stop。執行順序的話,先start再dump,最后stop。
JFR.configure參數 | 描述 | 值類型 | 默認值 |
---|---|---|---|
globalbuffercount | 指定global buffers的數量. 修改 memorysize參數會影響該值. | Long | 默認值依賴 memorysize 參數. |
globalbuffersize | 指定global buffers大小, 單位bytes. 修改 memorysize 參數會影響到global buffers. | Long | 默認值依賴 memorysize 參數. |
maxchunksize | 指定單個data chunk的最大值, 單位bytes | Long | 12582912 |
memorysize | 指定總內存大小, 單位bytes | Long | 10485760 |
repositorypath | 指定recordings在寫入到持久化文件之前的存儲路徑 | String | 默認為系統臨時目錄,Oracle Solaris以及Linux是/tmp.windows系統的話,取TMP環境變量值 |
stackdepth | 指定stack traces的Stack depth | Long | 64 |
thread_buffer_size | 指定每個thread的Local buffer size, 單位bytes. 不建議修改此參數,可能會降低性能 | Long | 8192 |
threadbufferstodisk | 是否允許thread buffers在buffer thread阻塞的時候直接寫到磁盤 | Boolean | false |
samplethreads | 是否開啟thread sampling | Boolean | true |
命令實例
jcmd 5793 JFR.configure 5793: Current configuration: Repository path: /private/var/folders/9r/v55wkcr91m5_g8h7lhgjzgr00000gn/T/2018_09_27_16_30_53_5793 Stack depth: 64 Global buffer count: 20 Global buffer size: 512.0 kB Thread buffer size: 8.0 kB Memory size: 10.0 MB Max chunk size: 12.0 MB Sample threads: trueJFR.start
參數 | 描述 | 值類型 | 默認值 |
---|---|---|---|
delay | 指定延時多長時間才開始記錄 | Integer類型加s表示秒, m表示分鐘, 或者h表示小時 | 0s |
disk | 記錄的時候是否寫數據到磁盤 | Boolean | true |
dumponexit | 是否在JVM關閉時寫記錄到磁盤. 如果為true但沒有指定filename, 則文件名為系統生成,包含process ID, recording ID,以及 current time stamp (例如,hotspot-pid-47496-id-1-2018_01_25_19_10_41.jfr),文件路徑為進程啟動路徑 . | Boolean | false |
duration | 指定記錄時長 | Integer類型加s表示秒, m表示分鐘, 或者h表示小時 | 0s (forever) |
filename | 指定停止時記錄數據的文件路徑,如果未指定,則使用進程使用目錄,例如recording.jfr`/home/user/recordings/recording.jfr`c: ecordings ecording.jfr | String | No default value |
maxage | 指定記錄數據在磁盤的最大存活時間,當disk參數為true時才有效 | Integer類型加s表示秒, m表示分鐘, 或者h表示小時 | 0s (forever) |
maxsize | 指定記錄數據在磁盤的最大大小,默認單位bytes,指定m或M表示兆,g或G表示G,只有當disk參數為true時才有效,該值不能比maxchunksize參數值小. | Long | 0 (no maximum size) |
name | 指定記錄文件名,如未指定則默認生成. | String | 默認為系統生成. |
path-to-gc-roots | JDK 10引入的,指定在記錄結束前要收集的GC Roots的路徑.該參數有助于排查內存泄露,但是收集比較耗時,當且僅當懷疑有內存泄露時才啟用。如果settings參數設置為profile, 則收集的信息包括潛在內存泄露對象的stack trace. | Boolean | false |
settings | 指定記錄的配置文件,如果不是JRE_HOME/lib/jfr目錄下的要指定全路徑,要指定多個的話,用逗號分隔。默認路徑有default.jfc: 該配置開銷低,可以用于持續運行.profile.jfc: 則提供比default更多的數據,但是開銷大一些,對性能有所影響,適合短時間收集信息用 | String | JRE_HOME/lib/jfr/default.jfc |
命令實例
jcmd 5793 JFR.start name=demojfr dumponexit=true 5793: Started recording 1. No limit specified, using maxsize=250MB as default. Use jcmd 5793 JFR.dump name=demojfr filename=FILEPATH to copy recording data to file.JFR.check
參數 | 描述 | 值類型 | 默認值 |
---|---|---|---|
name | 指定文件名 | String | No default value |
verbose | 是否打印event settings | Boolean | false |
命令實例
jcmd 5793 JFR.check 5793: Recording 1: name=demojfr maxsize=250.0MB (running)JFR.dump
參數 | 描述 | 值類型 | 默認值 |
---|---|---|---|
filename(required) | 指定dump寫入的路徑,如果未指定,則使用進程啟動的目錄,例如:recording.jfr`/home/user/recordings/recording.jfr`c: ecordings ecording.jfr | String | No default value |
name(required) | 指定要dump的記錄 | String | No default value |
path-to-gc-roots | JDK 10引入的,指定在記錄結束前要收集的GC Roots的路徑.該參數有助于排查內存泄露,但是收集比較耗時,當且僅當懷疑有內存泄露時才啟用. | Boolean | false |
命令實例
jcmd 5793 JFR.dump name=demojfr filename=/tmp/demo.jfr 5793: Dumped recording "demojfr", 480.8 kB written to: /tmp/demo.jfrJFR.stop
參數 | 描述 | 值類型 | 默認值 |
---|---|---|---|
filename | 指定停止時數據寫入的路徑.如果沒有指定則默認為進程啟動的目錄,例如recording.jfr`/home/user/recordings/recording.jfr`c: ecordings ecording.jfr | String | No default value |
name | 指定要stop的記錄的名稱 | String | No default value |
命令實例
jcmd 5793 JFR.stop name=demojfr 5793: Stopped recording "demojfr".JMC
JMC打開jfr文件實例截圖如下:
@Test public void testReadJfr() throws IOException { Path p = Paths.get(getClass().getClassLoader().getResource("demo.jfr").getPath()); Listevents = RecordingFile.readAllEvents(p); events.stream() .forEach(e -> LOGGER.info("eventType:{},startTime:{},endTime:{},fields:{}",e.getEventType().getName(),e.getStartTime(),e.getEndTime(),e.getFields())); List eventNames = events.stream() .map(e -> e.getEventType().getName()) .distinct() .collect(Collectors.toList()); System.out.println(eventNames.toString()); }
直接使用jdk的api即可以解析jfr文件,讀出RecordedEvent
eventType類型輸出如下:
[jdk.ExceptionStatistics, jdk.NativeMethodSample, jdk.ThreadSleep, jdk.JavaMonitorWait, jdk.CPULoad, jdk.JavaThreadStatistics, jdk.ClassLoadingStatistics, jdk.CompilerStatistics, jdk.ClassLoaderStatistics, jdk.ModuleExport, jdk.CodeCacheStatistics, jdk.CodeSweeperStatistics, jdk.GCConfiguration, jdk.ActiveSetting, jdk.ActiveRecording, jdk.InitialSystemProperty, jdk.InitialEnvironmentVariable, jdk.CPUInformation, jdk.CPUTimeStampCounter, jdk.ThreadAllocationStatistics, jdk.PhysicalMemory, jdk.NativeLibrary, jdk.CompilerConfiguration, jdk.CodeCacheConfiguration, jdk.CodeSweeperConfiguration, jdk.IntFlag, jdk.UnsignedIntFlag, jdk.LongFlag, jdk.UnsignedLongFlag, jdk.DoubleFlag, jdk.BooleanFlag, jdk.StringFlag, jdk.ThreadEnd, jdk.ThreadCPULoad, jdk.NetworkUtilization, jdk.ThreadStart, jdk.ThreadContextSwitchRate, jdk.GCSurvivorConfiguration, jdk.GCTLABConfiguration, jdk.GCHeapConfiguration, jdk.YoungGenerationConfiguration, jdk.SystemProcess, jdk.ThreadDump, jdk.JVMInformation, jdk.OSInformation, jdk.ModuleRequire]
除了系統定義的eventType,還可以自定義event自定義event
DemoEvent
@Label("Demo Event") @Description("Helps the programmer getting started") public class DemoEvent extends Event { @Label("Message") private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
發布事件
DemoEvent event = new DemoEvent(); event.setMessage("hello, world!"); event.commit();
之后使用api解析jfr文件,可以看到自定義的event,其name為com.example.jfr.DemoEvent相關模塊
可以使用如下參數啟動-XX:StartFlightRecording=duration=120s,filename=/tmp/event.jfr,settings=default,name=DemoEventRecording
JDK11關于jfr的模塊有兩個,分別是jdk.jfr.jmod以及jdk.management.jfr.jmod,其具體內容如下:
? jmods ../bin/jmod describe jdk.jfr.jmod jdk.jfr@11 exports jdk.jfr exports jdk.jfr.consumer requires java.base mandated qualified exports jdk.jfr.internal.management to jdk.management.jfr contains jdk.jfr.events contains jdk.jfr.internal contains jdk.jfr.internal.cmd contains jdk.jfr.internal.consumer contains jdk.jfr.internal.dcmd contains jdk.jfr.internal.handlers contains jdk.jfr.internal.instrument contains jdk.jfr.internal.jfc contains jdk.jfr.internal.settings contains jdk.jfr.internal.test contains jdk.jfr.internal.types platform macos-amd64 ? jmods ../bin/jmod describe jdk.management.jfr.jmod jdk.management.jfr@11 exports jdk.management.jfr requires java.base mandated requires java.management transitive requires jdk.jfr requires jdk.management provides sun.management.spi.PlatformMBeanProvider with jdk.management.jfr.internal.FlightRecorderMXBeanProvider contains jdk.management.jfr.internal platform macos-amd64小結
Java Flight Recorder是一款優秀的java應用診斷工具,以前是商業版的特性,現在在java11當中開源出來,它導出的jfr文件可以用Java Mission Control來分析。
JDK11內置了相關API,可以用來解析jfr文件,也可以在應用程序自定義事件發布出來
JFR可以采用JVM命令啟動,也可以使用jcmd的JFR.開頭的命令在運行時操作,非常方便
docUsing Java Flight Recorder
Java Flight Recorder Cheat Sheet
2 Diagnostic Command Reference
Clarifying some confusion around Java Flight Recordings
Java Flight Recorder:The Secret Arrow in Your Quiver
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77295.html
摘要:從版本開始,不再單獨發布或者版本了,有需要的可以自己通過去定制官方解讀官方細項解讀穩步推進系列六的小試牛刀一文讀懂的為何如此高效棄用引擎 Java語言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性 序 本文主要講述一下Java11的新...
摘要:千呼萬喚,于正式發布版本即,也就是官方推薦可以廣泛使用的版本,其中發布了包括等個新特性,讓我們一睹為快。一新特性一覽二發布計劃日期階段說明對進入階段的變化會應用越來越嚴格的審查。我們需要支持以保持競爭力并與最新標準保持同步。 千呼萬喚,JDK11于2018-09-25正式發布GA版本(GA即General Availability,也就是官方推薦可以廣泛使用的版本),其中發布了包括ZG...
摘要:來來來,花分鐘看看的七大新特性,還有代碼樣例。本地是指方法內的變量聲明。從開始,這個正式進入標準庫包。同步請求會阻止當前線程。可喜的是,如果嘗試改變不可變集合,會通過發出警告是在中引入的,增加了三個新方法。 現在Java有多元化的發展趨勢,既有JS又有C++還有C#的影子,不學習那是不行滴。來來來,花5分鐘看看Java9-Java11的七大新特性,還有代碼樣例。Java11 發布了,然...
摘要:到年將提供修復和安全更新。中期版本將每六個月發布一次。將擴展類文件格式以支持新的常量池形式。將提供一個低開銷的數據收集框架,用于對應用程序和進行故障排除。項目負責人表示,維護成本和低使用率并不能證明其保留是合理的。將是第一個獲得支持的平臺。 Java JDK 11刪除了CORBA,Java EE和JavaFX支持,但添加了十幾個主要新功能。 Java Development Kit(J...
摘要:前幾天的北京阿里云峰會,阿里巴巴正式宣布對外開源長期支持版本。此次,阿里巴巴發布的預覽版本對應的版本。同時對于阿里云,會針對的兩個版本和隨阿里云鏡像發布,免費提供給阿里云客戶使用。年月,發布,根據阿里大數據場景的定制版發布。 前幾天的北京阿里云峰會,阿里巴巴正式宣布對外開源 OpenJDK 長期支持版本 Alibaba Dragonwell。作為 Java 全球管理組織 Java Co...
閱讀 2174·2021-09-04 16:40
閱讀 1474·2021-08-13 15:07
閱讀 3614·2019-08-30 15:53
閱讀 3205·2019-08-30 13:11
閱讀 1085·2019-08-29 17:22
閱讀 1823·2019-08-29 12:47
閱讀 1486·2019-08-29 11:27
閱讀 2237·2019-08-26 18:42