摘要:序本文主要研究一下的使用。執(zhí)行順序的話,先再,最后。內(nèi)置了相關(guān),可以用來(lái)解析文件,也可以在應(yīng)用程序自定義事件發(fā)布出來(lái)可以采用命令啟動(dòng),也可以使用的開(kāi)頭的命令在運(yùn)行時(shí)操作,非常方便
序
本文主要研究一下Java Flight Recorder的使用。
命令主要有5個(gè)命令,configure、check、start、dump、stop。執(zhí)行順序的話,先start再dump,最后stop。
JFR.configure參數(shù) | 描述 | 值類型 | 默認(rèn)值 |
---|---|---|---|
globalbuffercount | 指定global buffers的數(shù)量. 修改 memorysize參數(shù)會(huì)影響該值. | Long | 默認(rèn)值依賴 memorysize 參數(shù). |
globalbuffersize | 指定global buffers大小, 單位bytes. 修改 memorysize 參數(shù)會(huì)影響到global buffers. | Long | 默認(rèn)值依賴 memorysize 參數(shù). |
maxchunksize | 指定單個(gè)data chunk的最大值, 單位bytes | Long | 12582912 |
memorysize | 指定總內(nèi)存大小, 單位bytes | Long | 10485760 |
repositorypath | 指定recordings在寫入到持久化文件之前的存儲(chǔ)路徑 | String | 默認(rèn)為系統(tǒng)臨時(shí)目錄,Oracle Solaris以及Linux是/tmp.windows系統(tǒng)的話,取TMP環(huán)境變量值 |
stackdepth | 指定stack traces的Stack depth | Long | 64 |
thread_buffer_size | 指定每個(gè)thread的Local buffer size, 單位bytes. 不建議修改此參數(shù),可能會(huì)降低性能 | Long | 8192 |
threadbufferstodisk | 是否允許thread buffers在buffer thread阻塞的時(shí)候直接寫到磁盤 | Boolean | false |
samplethreads | 是否開(kāi)啟thread sampling | Boolean | true |
命令實(shí)例
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
參數(shù) | 描述 | 值類型 | 默認(rèn)值 |
---|---|---|---|
delay | 指定延時(shí)多長(zhǎng)時(shí)間才開(kāi)始記錄 | Integer類型加s表示秒, m表示分鐘, 或者h表示小時(shí) | 0s |
disk | 記錄的時(shí)候是否寫數(shù)據(jù)到磁盤 | Boolean | true |
dumponexit | 是否在JVM關(guān)閉時(shí)寫記錄到磁盤. 如果為true但沒(méi)有指定filename, 則文件名為系統(tǒng)生成,包含process ID, recording ID,以及 current time stamp (例如,hotspot-pid-47496-id-1-2018_01_25_19_10_41.jfr),文件路徑為進(jìn)程啟動(dòng)路徑 . | Boolean | false |
duration | 指定記錄時(shí)長(zhǎng) | Integer類型加s表示秒, m表示分鐘, 或者h表示小時(shí) | 0s (forever) |
filename | 指定停止時(shí)記錄數(shù)據(jù)的文件路徑,如果未指定,則使用進(jìn)程使用目錄,例如recording.jfr`/home/user/recordings/recording.jfr`c: ecordings ecording.jfr | String | No default value |
maxage | 指定記錄數(shù)據(jù)在磁盤的最大存活時(shí)間,當(dāng)disk參數(shù)為true時(shí)才有效 | Integer類型加s表示秒, m表示分鐘, 或者h表示小時(shí) | 0s (forever) |
maxsize | 指定記錄數(shù)據(jù)在磁盤的最大大小,默認(rèn)單位bytes,指定m或M表示兆,g或G表示G,只有當(dāng)disk參數(shù)為true時(shí)才有效,該值不能比maxchunksize參數(shù)值小. | Long | 0 (no maximum size) |
name | 指定記錄文件名,如未指定則默認(rèn)生成. | String | 默認(rèn)為系統(tǒng)生成. |
path-to-gc-roots | JDK 10引入的,指定在記錄結(jié)束前要收集的GC Roots的路徑.該參數(shù)有助于排查內(nèi)存泄露,但是收集比較耗時(shí),當(dāng)且僅當(dāng)懷疑有內(nèi)存泄露時(shí)才啟用。如果settings參數(shù)設(shè)置為profile, 則收集的信息包括潛在內(nèi)存泄露對(duì)象的stack trace. | Boolean | false |
settings | 指定記錄的配置文件,如果不是JRE_HOME/lib/jfr目錄下的要指定全路徑,要指定多個(gè)的話,用逗號(hào)分隔。默認(rèn)路徑有default.jfc: 該配置開(kāi)銷低,可以用于持續(xù)運(yùn)行.profile.jfc: 則提供比default更多的數(shù)據(jù),但是開(kāi)銷大一些,對(duì)性能有所影響,適合短時(shí)間收集信息用 | String | JRE_HOME/lib/jfr/default.jfc |
命令實(shí)例
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
參數(shù) | 描述 | 值類型 | 默認(rèn)值 |
---|---|---|---|
name | 指定文件名 | String | No default value |
verbose | 是否打印event settings | Boolean | false |
命令實(shí)例
jcmd 5793 JFR.check 5793: Recording 1: name=demojfr maxsize=250.0MB (running)JFR.dump
參數(shù) | 描述 | 值類型 | 默認(rèn)值 |
---|---|---|---|
filename(required) | 指定dump寫入的路徑,如果未指定,則使用進(jìn)程啟動(dòng)的目錄,例如: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引入的,指定在記錄結(jié)束前要收集的GC Roots的路徑.該參數(shù)有助于排查內(nèi)存泄露,但是收集比較耗時(shí),當(dāng)且僅當(dāng)懷疑有內(nèi)存泄露時(shí)才啟用. | Boolean | false |
命令實(shí)例
jcmd 5793 JFR.dump name=demojfr filename=/tmp/demo.jfr 5793: Dumped recording "demojfr", 480.8 kB written to: /tmp/demo.jfrJFR.stop
參數(shù) | 描述 | 值類型 | 默認(rèn)值 |
---|---|---|---|
filename | 指定停止時(shí)數(shù)據(jù)寫入的路徑.如果沒(méi)有指定則默認(rèn)為進(jìn)程啟動(dòng)的目錄,例如recording.jfr`/home/user/recordings/recording.jfr`c: ecordings ecording.jfr | String | No default value |
name | 指定要stop的記錄的名稱 | String | No default value |
命令實(shí)例
jcmd 5793 JFR.stop name=demojfr 5793: Stopped recording "demojfr".JMC
JMC打開(kāi)jfr文件實(shí)例截圖如下:
@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]
除了系統(tǒng)定義的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; } }
發(fā)布事件
DemoEvent event = new DemoEvent(); event.setMessage("hello, world!"); event.commit();
之后使用api解析jfr文件,可以看到自定義的event,其name為com.example.jfr.DemoEvent相關(guān)模塊
可以使用如下參數(shù)啟動(dòng)-XX:StartFlightRecording=duration=120s,filename=/tmp/event.jfr,settings=default,name=DemoEventRecording
JDK11關(guān)于jfr的模塊有兩個(gè),分別是jdk.jfr.jmod以及jdk.management.jfr.jmod,其具體內(nèi)容如下:
? 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小結(jié)
Java Flight Recorder是一款優(yōu)秀的java應(yīng)用診斷工具,以前是商業(yè)版的特性,現(xiàn)在在java11當(dāng)中開(kāi)源出來(lái),它導(dǎo)出的jfr文件可以用Java Mission Control來(lái)分析。
JDK11內(nèi)置了相關(guān)API,可以用來(lái)解析jfr文件,也可以在應(yīng)用程序自定義事件發(fā)布出來(lái)
JFR可以采用JVM命令啟動(dòng),也可以使用jcmd的JFR.開(kāi)頭的命令在運(yùn)行時(shí)操作,非常方便
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
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77295.html
摘要:從版本開(kāi)始,不再單獨(dú)發(fā)布或者版本了,有需要的可以自己通過(guò)去定制官方解讀官方細(xì)項(xiàng)解讀穩(wěn)步推進(jìn)系列六的小試牛刀一文讀懂的為何如此高效棄用引擎 Java語(yǔ)言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性 序 本文主要講述一下Java11的新...
摘要:千呼萬(wàn)喚,于正式發(fā)布版本即,也就是官方推薦可以廣泛使用的版本,其中發(fā)布了包括等個(gè)新特性,讓我們一睹為快。一新特性一覽二發(fā)布計(jì)劃日期階段說(shuō)明對(duì)進(jìn)入階段的變化會(huì)應(yīng)用越來(lái)越嚴(yán)格的審查。我們需要支持以保持競(jìng)爭(zhēng)力并與最新標(biāo)準(zhǔn)保持同步。 千呼萬(wàn)喚,JDK11于2018-09-25正式發(fā)布GA版本(GA即General Availability,也就是官方推薦可以廣泛使用的版本),其中發(fā)布了包括ZG...
摘要:來(lái)來(lái)來(lái),花分鐘看看的七大新特性,還有代碼樣例。本地是指方法內(nèi)的變量聲明。從開(kāi)始,這個(gè)正式進(jìn)入標(biāo)準(zhǔn)庫(kù)包。同步請(qǐng)求會(huì)阻止當(dāng)前線程??上驳氖?,如果嘗試改變不可變集合,會(huì)通過(guò)發(fā)出警告是在中引入的,增加了三個(gè)新方法。 現(xiàn)在Java有多元化的發(fā)展趨勢(shì),既有JS又有C++還有C#的影子,不學(xué)習(xí)那是不行滴。來(lái)來(lái)來(lái),花5分鐘看看Java9-Java11的七大新特性,還有代碼樣例。Java11 發(fā)布了,然...
摘要:到年將提供修復(fù)和安全更新。中期版本將每六個(gè)月發(fā)布一次。將擴(kuò)展類文件格式以支持新的常量池形式。將提供一個(gè)低開(kāi)銷的數(shù)據(jù)收集框架,用于對(duì)應(yīng)用程序和進(jìn)行故障排除。項(xiàng)目負(fù)責(zé)人表示,維護(hù)成本和低使用率并不能證明其保留是合理的。將是第一個(gè)獲得支持的平臺(tái)。 Java JDK 11刪除了CORBA,Java EE和JavaFX支持,但添加了十幾個(gè)主要新功能。 Java Development Kit(J...
摘要:前幾天的北京阿里云峰會(huì),阿里巴巴正式宣布對(duì)外開(kāi)源長(zhǎng)期支持版本。此次,阿里巴巴發(fā)布的預(yù)覽版本對(duì)應(yīng)的版本。同時(shí)對(duì)于阿里云,會(huì)針對(duì)的兩個(gè)版本和隨阿里云鏡像發(fā)布,免費(fèi)提供給阿里云客戶使用。年月,發(fā)布,根據(jù)阿里大數(shù)據(jù)場(chǎng)景的定制版發(fā)布。 前幾天的北京阿里云峰會(huì),阿里巴巴正式宣布對(duì)外開(kāi)源 OpenJDK 長(zhǎng)期支持版本 Alibaba Dragonwell。作為 Java 全球管理組織 Java Co...
閱讀 2192·2021-09-04 16:40
閱讀 1495·2021-08-13 15:07
閱讀 3626·2019-08-30 15:53
閱讀 3219·2019-08-30 13:11
閱讀 1104·2019-08-29 17:22
閱讀 1835·2019-08-29 12:47
閱讀 1506·2019-08-29 11:27
閱讀 2261·2019-08-26 18:42