jmc:Java Mission Control
使用 JMC可以監(jiān)視和管理 Java 應(yīng)用程序潦蝇,不會導(dǎo)致相關(guān)工具類的大幅度性能開銷到腥,它使用為 Java 虛擬機(jī) (JVM) 的普通自適應(yīng)動態(tài)優(yōu)化收集的數(shù)據(jù)。
主要部分
JVM瀏覽器:顯示了正在運(yùn)行的 Java 應(yīng)用程序及其 JVM窑业,每個JVM實(shí)例稱為一個JVM連接愿汰。JVM瀏覽器允許用戶列出并連接到本地和遠(yuǎn)程運(yùn)行的 Java 應(yīng)用困后。它能夠使用 Java 發(fā)現(xiàn)協(xié)議(JDP)自動地發(fā)現(xiàn)本地和遠(yuǎn)程運(yùn)行的 Java 進(jìn)程。
JMX 控制臺:能夠通過 JMX 接口管理并監(jiān)控 JDK 衬廷,實(shí)時收集并顯示其特征摇予。它提供了實(shí)時集合、堆使用情況吗跋、CPU 負(fù)載以及其他通過 MBeans 暴露的和在 MBean 服務(wù)器中注冊的信息侧戴,并可通過托管 Bean (MBean) 更改一些運(yùn)行時屬性。還可以創(chuàng)建在特定事件上觸發(fā)的規(guī)則 (例如跌宛,如果應(yīng)用程序的 CPU 占用率達(dá)到了 90%酗宋,則發(fā)送電子郵件)。
JFR:提供了一種從操作系統(tǒng)層疆拘、JVM 和 Java 應(yīng)用程序?qū)邮占录姆绞酵擅āJ占氖录ň€程延時事件,例如休眠(sleep)哎迄、等待(wait)回右、鎖競爭、I/O漱挚、GC 和方法分析翔烁。
Java Mission Control 插件使用 Java Management Extensions (JMX) 代理連接到 JVM
啟動JMC后,連接某個本地應(yīng)用后旨涝,出現(xiàn)如下界面:
遠(yuǎn)程連接JVM(通過JMX連接如果想要用jmc監(jiān)控遠(yuǎn)程的JVM進(jìn)程蹬屹,配置方式和jvisualvm方式一一樣即可)
本地連接比較簡單這里就不在贅述,遠(yuǎn)程連接JVM颊糜,這里利用VMWare工具進(jìn)行模擬哩治,過程中遇到一些問題,值得注意的衬鱼。
首先业筏,遠(yuǎn)程機(jī)器被監(jiān)控的程序需要開啟調(diào)試端口,在執(zhí)行java命令行中加入以下屬性鸟赫,屬性沒有以ssl安全認(rèn)證方式連接的蒜胖,案例中啟動監(jiān)聽端口為7091
JMX配置(被監(jiān)控的遠(yuǎn)程Tomcat)
進(jìn)入tomcat安裝目錄安裝找到catalina.sh文件消别,在CATALINA_OPTS中增加一下配置:
-Dcom.sun.management.jmxremote=true
-Djava.rmi.server.hostname=115.29.206.6
-Dcom.sun.management.jmxremote.port=6666
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.managementote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
配置成功之后我的CATALINA_OPTS為:
CATALINA_OPTS="-Xms1024m -Xmx6144m -XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
-Dspring.profiles.active=production
-Xloggc:/data/logs/gc-`date +"%Y-%m-%d_%H%M%S"`.log
-XX:MaxPermSize=1024M
-Dcom.sun.management.jmxremote=true
-Djava.rmi.server.hostname=115.29.206.6
-Dcom.sun.management.jmxremote.port=6666
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.managementote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder"
主要配置項(xiàng)說明:
-Djava.rmi.server.hostname=115.29.206.6
:這個配置的值是遠(yuǎn)程tomcat服務(wù)器的外網(wǎng)ip。-Dcom.sun.management.jmxremote.port=6666
:這個是對外開放的端口台谢,后面在配置客戶端的時候需要用到這個寻狂。
創(chuàng)建完成后雙擊MBean或者右鍵–>打開JMX控制臺,均能打開控制臺
展示面板
概覽
默認(rèn)布局提供 CPU 和內(nèi)存使用情況的概覽朋沮。
概覽:可以添加自定義圖表蛇券,通過概覽的加號”添加圖表”實(shí)現(xiàn);可以重置樊拓,通過”重置為默認(rèn)控件”實(shí)現(xiàn)纠亚。
添加圖表后,可以通過圖表的加號添加相應(yīng)的子項(xiàng)筋夏,并可以在圖表上右鍵詳細(xì)設(shè)置(如下圖中的Test)
MBean瀏覽器
JMC使用托管Bean (MBean) 為監(jiān)視和管理 Java 應(yīng)用程序性能提供統(tǒng)一且一致的界面蒂胞。MBean 是采用符合 JMX 規(guī)范的設(shè)計(jì)模式的托管對象。MBean 可以表示一個設(shè)備条篷、一個應(yīng)用程序或需要托管的任何資源骗随。MBean 的管理界面由一組屬性、操作和通知組成赴叹。
MBean 瀏覽器提供對所有已注冊 MBean 的訪問鸿染。MBean 在管理服務(wù)器中注冊,后者可以通過與 Java Management Extensions (JMX) 兼容的客戶機(jī)訪問
要創(chuàng)建和注冊新 MBean乞巧,請單擊 MBean 面板加號圖標(biāo)牡昆。執(zhí)行此操作會啟動動態(tài)創(chuàng)建和注冊新的 MBean 向?qū)В崾緸樾?MBean 輸入對象名和類名摊欠。若要繼續(xù),對象名必須有效柱宦,并且類名必須是有效的 Java 類名些椒。請注意,該向?qū)Р粫?yàn)證類是否對 MBean 服務(wù)器可用掸刊;將只進(jìn)行語法檢查免糕。要注銷特定 MBean,右鍵單擊并從上下文菜單中選擇注銷忧侧。
MBean功能
- 屬性:列出所選 MBean 的屬性石窑。
- 操作:列出可從所選 MBean 調(diào)用的操作。
- 通知:列出在運(yùn)行時期間 MBean 所提示的通知蚓炬。
- 元數(shù)據(jù):包含描述 MBean 的信息松逊。
觸發(fā)器
使用觸發(fā)器選項(xiàng)卡可以管理滿足特定條件時觸發(fā)事件的規(guī)則。這是一種無需持續(xù)地監(jiān)視應(yīng)用程序即可跟蹤運(yùn)行時問題的有用方法肯夏。以灰色顯示的規(guī)則在監(jiān)視的 JVM 中不可用经宏。默認(rèn)情況下犀暑,停用所有規(guī)則。要激活某個規(guī)則烁兰,請選中該規(guī)則旁邊的復(fù)選框
規(guī)則詳細(xì)信息
- 條件:選擇觸發(fā)規(guī)則時所在的屬性和值耐亏。
- 操作:選擇應(yīng)由規(guī)則觸發(fā)的事件。
- 約束條件:選擇激活規(guī)則時的時間約束條件沪斟。
創(chuàng)建觸發(fā)器
設(shè)置觸發(fā)規(guī)則的條件:
最大觸發(fā)值:最大觸發(fā)值(對于數(shù)值屬性) 或匹配字符串 (對于非數(shù)值屬性),指定用于觸發(fā)規(guī)則的選定屬性的最大值或匹配字符串广辰。
持續(xù)時間:指定條件必須保持為“真”以觸發(fā)規(guī)則的持續(xù)時間 (默認(rèn)秒)。
限制時間段:指定可以接下來再次觸發(fā)規(guī)則所要經(jīng)過的最短時間長度 (默認(rèn)秒)主之。
滿足條件時觸發(fā):選擇是否在滿足條件時觸發(fā)規(guī)則择吊。例如,如果觸發(fā)值設(shè)置為 100杀餐,則在值從小于 100 更改為 100 或更高值時觸發(fā)規(guī)則干发。
從條件恢復(fù)時觸發(fā):選擇是否當(dāng)不再滿足條件時觸發(fā)規(guī)則。例如史翘,如果觸發(fā)值設(shè)置為 100枉长,則在值從 100 或更高值更改為 100 時觸發(fā)規(guī)則。
在規(guī)則觸發(fā)時發(fā)生的操作
應(yīng)用程序預(yù)警:在JMC中顯示預(yù)警對話框琼讽。
控制臺輸出:將通知發(fā)送到啟動 JMX 控制臺的控制臺 (命令提示) 的標(biāo)準(zhǔn)輸出 (stdout)必峰。
轉(zhuǎn)儲飛行記錄:將最后指定時段 (秒) 的飛行記錄中可用的全部數(shù)據(jù)轉(zhuǎn)儲到 JFR 文件。
HPROF 轉(zhuǎn)儲:啟動到指定 HPROF 文件的內(nèi)存轉(zhuǎn)儲钻蹬。
調(diào)用診斷命令:調(diào)用指定的診斷命令吼蚁,通過附加或覆蓋結(jié)果將輸出記錄到指定的 LOG 文件。
記錄到文件:將通知寫入到指定的 TXT 日志文件问欠。
發(fā)送電子郵件:通過電子郵件發(fā)送通知肝匆。可以配置 SMTP 服務(wù)器地址和端口顺献、電子郵件的接收方和發(fā)送方并提供 SSL 身份證明 (如果需要安全連接)旗国。
啟動連續(xù)飛行記錄:啟動連續(xù)飛行記錄。
啟動限時飛行記錄:啟動飛行記錄注整,在指定的時段之后將結(jié)果轉(zhuǎn)儲到 JFR 文件中能曾。
系統(tǒng)
系統(tǒng)選項(xiàng)卡提供了運(yùn)行 JVM 的系統(tǒng)的信息、JVM 的性能屬性以及系統(tǒng)屬性列表肿轨。
服務(wù)器信息
在系統(tǒng)選項(xiàng)卡頂部的服務(wù)器信息面板中寿冕,包含運(yùn)行 JVM 的服務(wù)器的類別和值列表。這些信息對調(diào)試應(yīng)用程序開發(fā)問題和運(yùn)行時問題以及提出支持請求非常有用椒袍。這是一般系統(tǒng)信息驼唱,不能更改。JVM 統(tǒng)計(jì)信息
JVM 統(tǒng)計(jì)信息面板包含 JVM 主要性能屬性的當(dāng)前值驹暑。默認(rèn)情況下曙蒸,表中顯示以下屬性:當(dāng)前已加載類計(jì)數(shù)
運(yùn)行時間
要向表中添加屬性捌治,請單擊 JVM 統(tǒng)計(jì)信息面板右上角的添加屬性按鈕。要刪除屬性纽窟,請?jiān)诒碇杏益I單擊該屬性肖油,然后選擇刪除。右鍵單擊屬性后臂港,可以更改其更新間隔森枪、單位,而對于一些屬性审孽,還可以設(shè)置值县袱。
- 系統(tǒng)屬性
系統(tǒng)屬性面板包含一個表,其中列出使用 JVM 調(diào)用的所有屬性的關(guān)鍵字和值佑力。要篩選屬性式散,請選擇篩選列 (關(guān)鍵字或值),并在表上方的文本字段中指定篩選器字符串打颤。
要配置表外觀暴拄,請單擊系統(tǒng)屬性面板右上角的表設(shè)置按鈕,然后選擇要顯示或隱藏的列编饺。對于各列乖篷,可以設(shè)置最小寬度、比例和初始排序順序透且。展示的是一般系統(tǒng)信息撕蔼,不能更改。
內(nèi)存
使用內(nèi)存選項(xiàng)卡可以監(jiān)視應(yīng)用程序使用內(nèi)存資源的效率秽誊。此選項(xiàng)卡主要提供以下方面的信息:堆使用量鲸沮、垃圾收集和活動內(nèi)存池。此選項(xiàng)卡上提供的信息可幫助確定是否已將 JVM 配置為提供最佳應(yīng)用程序性能锅论。
在內(nèi)存選項(xiàng)卡中诉探,可以使用該選項(xiàng)卡右上角的運(yùn)行完全垃圾收集按鈕手動啟動完全垃圾收集。
- GC 表
GC 表面板包含可用垃圾收集器的主要性能屬性的當(dāng)前值棍厌。該面板分為標(biāo)有活動垃圾收集器名稱的多個選項(xiàng)卡 - 總收集時間
- 收集計(jì)數(shù)
- GC 開始時間
- GC 結(jié)束時間
- GC 持續(xù)時間
- GC ID
- GC 線程計(jì)數(shù)
右鍵單擊屬性后,可以更改其更新間隔竖席、單位耘纱,而對于一些屬性,還可以設(shè)置值毕荐。
活動內(nèi)存池
活動內(nèi)存池面板包含一個表束析,其中列出可供 JVM 使用的內(nèi)存池的信息。默認(rèn)情況下憎亚,該表包含以下列:池名稱:內(nèi)存池的名稱员寇。
類型:內(nèi)存池的類型弄慰。如果內(nèi)存池屬于 Java 堆,則類型為 HEAP陆爽,否則為 NON_HEAP驴剔。
已用:當(dāng)前已用的內(nèi)存池大小布讹。
最大值:內(nèi)存池的最大大小挠乳。
占用率:當(dāng)前使用量占最大內(nèi)存池大小的百分比。
已用峰值:在受監(jiān)視 JVM 的有效期內(nèi)內(nèi)存池已用內(nèi)存的峰值。
最大值峰值:在受監(jiān)視 JVM 的有效期內(nèi)最大內(nèi)存池大小的峰值。
線程
使用線程選項(xiàng)卡可以監(jiān)視線程活動额划。此選項(xiàng)卡包含一個繪制應(yīng)用程序隨時間推移的活動線程使用情況的圖形燥滑、一個由該應(yīng)用程序使用的所有活動線程的表以及選定線程的堆棧跟蹤羽历。
-
活動線程圖
活動線程圖顯示 Java 應(yīng)用程序隨時間推移啟動的線程數(shù)秕磷。默認(rèn)情況下疏尿,圖形中顯示以下屬性:- 高峰活動線程計(jì)數(shù)
- 活動線程總計(jì)數(shù)
- 守護(hù)程序活動線程計(jì)數(shù)
-
活動線程
活動線程面板包含一個表晤郑,其中列出 Java 應(yīng)用程序所啟動活動線程的信息造寝。默認(rèn)情況下磕洪,該表包含以下列:- 線程名稱:線程的名稱。
- 線程狀態(tài):線程的狀態(tài)诫龙。線程可以是以下狀態(tài)之一:NEW析显、RUNNABLE、BLOCKED签赃、WAITING谷异、TIMED_WAITING 或 TERMINATED。
- 受阻計(jì)數(shù):線程處于 BLOCKED 狀態(tài)的次數(shù)锦聊。
- CPU 總體占用率:線程所使用 CPU 資源占總 CPU 資源的百分比歹嘹。默認(rèn)情況下不提取此值。要啟用它括丁,請?jiān)诒砩戏竭x擇 CPU 概要分析。
- 死鎖:線程是否已死鎖伶选。默認(rèn)情況下不提取此值史飞。要啟用它尖昏,請?jiān)诒砩戏竭x擇死鎖檢測。
- 已分配的字節(jié):已分配給線程的字節(jié)數(shù)构资。默認(rèn)情況下不提取此值抽诉。要啟用它,請?jiān)诒砩戏竭x擇分配吐绵。
實(shí)時監(jiān)視最后三個值會消耗大量系統(tǒng)資源迹淌。這就是默認(rèn)情況下禁用它們的原因。使用表上方相應(yīng)的復(fù)選框己单,對這些值啟用監(jiān)視唉窃。
- 選定線程的堆棧跟蹤
在活動線程表中選擇線程后,其整個堆棧跟蹤將顯示在下面的選定線程的堆棧跟蹤面板中纹笼。堆棧跟蹤包含所有方法 (一直到當(dāng)前執(zhí)行的方法) 的調(diào)用路徑纹份。它非常有用,例如廷痘,當(dāng)需要確定導(dǎo)致死鎖或代碼執(zhí)行過程中意外中斷的方法時蔓涧。
可以使用 Ctrl 鍵在活動線程表中選擇多個線程來顯示多個堆棧跟蹤。
診斷命令
使用診斷命令可監(jiān)視 Java 應(yīng)用程序的效率和性能笋额。JMC 使用大量不同的診斷工具元暴,包括一組可以使用診斷命令選項(xiàng)卡針對應(yīng)用程序運(yùn)行的命令。
運(yùn)行 JMX 控制臺監(jiān)視 JVM 的額外成本很小兄猩,幾乎可以忽略不計(jì)茉盏。它提供低成本的應(yīng)用程序監(jiān)視和概要分析 JMX標(biāo)準(zhǔn)參考
JFR:Java Flight Recorder
JFR 是 JMC 中一個非常關(guān)鍵的功能。是一個用于收集有關(guān)正在運(yùn)行的 Java 應(yīng)用程序的診斷數(shù)據(jù)和概要分析數(shù)據(jù)的工具厦滤。它記錄了 JVM 所有事件的歷史數(shù)據(jù)援岩,通過這些數(shù)據(jù),程序性能分析人員可以結(jié)合以往的歷史數(shù)據(jù)對 JVM 性能瓶頸進(jìn)行分析診斷掏导。它集成到 Java 虛擬機(jī) (JVM) 中享怀,幾乎不會帶來性能開銷,因此甚至可以在高負(fù)載生產(chǎn)環(huán)境中使用趟咆。使用默認(rèn)設(shè)置時添瓷,內(nèi)部測試和客戶反饋表明性能影響低于 1%。對于一些應(yīng)用程序值纱,這一數(shù)字會大幅降低鳞贷。但是,對于短時間運(yùn)行的應(yīng)用程序 (不是在生產(chǎn)環(huán)境中運(yùn)行的應(yīng)用程序類型)虐唠,相對的啟動和預(yù)熱時間可能會較長搀愧,這對性能的影響可能會超過 1%。JFR 收集有關(guān) JVM 及其上運(yùn)行的 Java 應(yīng)用程序的數(shù)據(jù)。
JFR 的基本操作是開啟一系列的事件咱筛。當(dāng)某個事件發(fā)生時搓幌,這個事件的所有數(shù)據(jù)將會被保存至內(nèi)存或者一個文件當(dāng)中。數(shù)據(jù)流被保留在一個環(huán)形緩存中迅箩,所以只有最近發(fā)生的事件的數(shù)據(jù)才是可用的溉愁。JMC 可以從 JVM 或者文件中讀取并展示這些事件數(shù)據(jù),通過這些數(shù)據(jù)饲趋,可以進(jìn)行性能分析拐揭。
啟用 Java 飛行記錄器
默認(rèn)情況下,在 JVM 中禁用了 JFR奕塑。要啟用 JFR堂污,必須使用 -XX:+FlightRecorder 選項(xiàng)啟動 Java 應(yīng)用程序。由于 JFR 是一種商業(yè)功能爵川,僅在基于 Java 平臺標(biāo)準(zhǔn)版 (Oracle Java SE Advanced 和 Oracle Java SE Suite) 的商業(yè)包中提供敷鸦,因此還需要使用 -XX:+UnlockCommercialFeatures 選項(xiàng)來啟用商業(yè)功能。(可以參閱在準(zhǔn)備階段配置中的配置)
使用命令行選項(xiàng)可以
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder ……
請注意寝贡,在 JVM 上運(yùn)行依賴于 lambda 表單的其他語言時 (如 JavaScript 實(shí)施 Nashorn)扒披,堆棧跟蹤的深度會非常深。要確保對大堆棧的堆棧跟蹤正確采樣圃泡,可能需要增加飛行記錄器的堆棧深度碟案。通常將此值設(shè)置為 1024 便已足夠:
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=stackdepth=1024 ……
JFR 具有以下優(yōu)勢
- 提供更好的數(shù)據(jù):JFR 使用的相關(guān)數(shù)據(jù)模型使其易于交叉引用和過濾事件。
- 允許使用第三方事件提供程序:JFR 通過一組 API 監(jiān)視第三方應(yīng)用程序
- 降低總體成本:使用 JFR 可以縮短在診斷問題和排除問題方面所花的時間颇蜡、減少運(yùn)營成本和業(yè)務(wù)中斷价说、在出現(xiàn)問題時能夠更快地予以解決,并且可以提高系統(tǒng)效率风秤。
JFR 使用場景
- 概要分析
JFR 連續(xù)保存有關(guān)正在運(yùn)行的系統(tǒng)的大量數(shù)據(jù)鳖目。此概要分析信息包括線程樣本 (其中顯示程序在什么地方占用了時間)、鎖概要文件以及垃圾收集詳細(xì)信息缤弦。 - 黑匣子分析
JFR 將信息連續(xù)保存到循環(huán)緩沖區(qū)领迈。可在檢測到異常時評估此信息以查找原因碍沐。 - 支持和調(diào)試
在與 Oracle 技術(shù)支持聯(lián)系以幫助診斷 Java 應(yīng)用程序的問題時狸捅,JFR 收集的數(shù)據(jù)非常重要。
JFR展示的項(xiàng)目
飛行記錄器插件在一系列選項(xiàng)卡和子選項(xiàng)卡中顯示記錄文件的信息累提,并帶有包含表和圖形的面板尘喝。選項(xiàng)卡排列在選項(xiàng)卡組中,這些選項(xiàng)卡組可合并有關(guān) JVM 和 Java 應(yīng)用程序運(yùn)行時的特定方面的數(shù)據(jù)斋陪。
- 一般信息:關(guān)于 JVM朽褪、系統(tǒng)和記錄的一般信息置吓。
- 內(nèi)存:關(guān)于內(nèi)存管理和垃圾收集的信息。
- 代碼:關(guān)于方法缔赠、異常錯誤交洗、編譯和類加載的信息。
- 線程:關(guān)于應(yīng)用程序中線程和鎖的信息橡淑。
- I/O:關(guān)于文件和套接字 I/O 的信息。
- 系統(tǒng):關(guān)于正在運(yùn)行 JVM 的系統(tǒng)咆爽、進(jìn)程和環(huán)境變量的信息梁棠。
- 事件:關(guān)于記錄中的事件類型的信息,可以根據(jù)線程或堆棧跟蹤斗埂,按照日志或圖形的格式查看符糊,也可顯示為直方圖。
JFR一般信息
一般信息選項(xiàng)卡組顯示有關(guān) JVM呛凶、系統(tǒng)和記錄的一般信息男娄。
- 概覽選項(xiàng)卡提供系統(tǒng)、JVM 和 Java 應(yīng)用程序的高級視圖:堆使用量漾稀、CPU 總體占用率模闲、GC 暫停時間、CPU 占用率崭捍、堆使用量尸折、jmv啟動時間和jvm完成版本
-
提供有關(guān) JVM 的一般信息
-
列出用于啟動 JVM 的系統(tǒng)屬性
-
記錄選項(xiàng)卡提供有關(guān)記錄、可在記錄中使用的事件類型及其設(shè)置的信息
JFR內(nèi)存
內(nèi)存選項(xiàng)卡組顯示有關(guān)內(nèi)存管理和垃圾收集的信息
-
提供內(nèi)存使用量和垃圾收集的高級視圖
-
提供有關(guān)在記錄時段內(nèi)發(fā)生的垃圾收集活動的信息
-
顯示有關(guān)在記錄時段內(nèi)發(fā)生的垃圾收集的運(yùn)行時間以及這些垃圾收集導(dǎo)致的暫停時間的信息
-
有關(guān)垃圾收集器殷蛇、Java 堆和年輕代的配置信息
-
有關(guān)線程本地分配緩沖區(qū) (TLAB) 內(nèi)外的已分配對象的數(shù)據(jù)
TLAB中的內(nèi)存分配和TLAB外的內(nèi)存分配事件实夹。新TLAB分配提供了三種以上專供于分析新TLAB分配事件的虛擬化類型:類級、線程級和分析級的分配粒梦。分析級分配是對這三種類型的一個簡單的棧追蹤集合亮航。TLAB外分配的內(nèi)存標(biāo)簽頁和新TLAB標(biāo)簽頁的工作原理相同,僅僅在這個時間點(diǎn)是一致的匀们。
限制:因?yàn)樾耇LAB的內(nèi)存分配事件僅僅只是總的線程本地內(nèi)存分配的樣本缴淋,僅僅只有一個事件是很難說明實(shí)際情況的。更多的事件才會有更精確的圖片昼蛀。此外宴猾,如果分配事件的行為在記錄期間變化非常大,那么這樣也很難建立一個十分有說服力本地內(nèi)存分配視圖叼旋。
-
對象統(tǒng)計(jì)信息”選項(xiàng)卡提供有關(guān)占用 Java 堆超過 0.5% 的對象的信息
JFR代碼
代碼分析是Java性能分析重點(diǎn)仇哆,通過代碼分析,可以清楚的知道系統(tǒng)運(yùn)行時夫植,哪些類及方法被高頻率的調(diào)用
代碼選項(xiàng)卡組包含有關(guān)方法讹剔、異常錯誤油讯、編譯和類加載的信息。該選項(xiàng)卡組用于分析與代碼執(zhí)行相關(guān)的 Java 應(yīng)用程序的各個方面延欠。如果 JVM 未生成任何 CPU 負(fù)載陌兑,線程通常處于等待狀態(tài),因此將不會在此選項(xiàng)卡組中獲取大量有意義的統(tǒng)計(jì)信息由捎。
-
提供 Java 應(yīng)用程序中最常用的包和類的高級視圖
-
提供有關(guān) Java 應(yīng)用程序中最常用的方法的信息
查看熱點(diǎn)方法調(diào)用棧兔综,可以了解到系統(tǒng)的主要計(jì)算資源消耗情況
-
顯示所有采樣的堆棧跟蹤 (從 main() 和 run() 開始)。
以模塊化的方式直觀的看到系統(tǒng)運(yùn)行狀態(tài),顯示最常用的堆棧跟蹤狞玛,這對于查找 Java 應(yīng)用程序中的瓶頸非常有幫助;
-
顯示有關(guān)由 Java 應(yīng)用程序引發(fā)的錯誤和異常錯誤的信息
-
有關(guān)記錄期間生成的代碼的信息
-
有關(guān)記錄期間加載和卸載的類的信息软驰,以及有關(guān)每次加載和卸載的詳細(xì)信息
JFR線程
線程選項(xiàng)卡組包含有關(guān) Java 應(yīng)用程序中的線程和鎖的信息⌒姆荆可以得知CPU占用率的分布(系統(tǒng)占用率锭亏、應(yīng)用程序+JVM占用率)和活動線程數(shù),判斷CPU占用率分布是否合理硬鞍。
-
提供 CPU 負(fù)載和線程計(jì)數(shù)的高級視圖
-
有關(guān) JVM 最常使用的線程的信息慧瘤,詳細(xì)列出了熱點(diǎn)線程的數(shù)量及詳情
含有關(guān)鎖、受阻線程和阻塞線程的信息固该。當(dāng)存在性能問題但 CPU 負(fù)載不高時锅减,某些線程可能被阻止。此選項(xiàng)卡對分析線程阻止問題和查找鎖過多的根源非常有用
線程爭用是解決應(yīng)用性能比較關(guān)鍵的步驟伐坏,定位線程爭用的情況上煤,可發(fā)幅度提升性能有
-
關(guān)導(dǎo)致線程不執(zhí)行 Java 代碼 (線程停滯) 的事件的信息≈可以查看線程休眠劫狠、等待、受阻等等所花費(fèi)的時間
-
有關(guān)記錄期間發(fā)生的線程轉(zhuǎn)儲的信息
-
有關(guān) Java 應(yīng)用程序中的鎖定實(shí)例事件的信息
JFR I/O
I/O 選項(xiàng)卡組包含有關(guān)文件以及套接字讀取和寫入的信息永部。此選項(xiàng)卡組可用于分析 Java 應(yīng)用程序處理的數(shù)據(jù)量独泞。
提供文件以及套接字讀取和寫入的高級視圖
有關(guān)在記錄期間進(jìn)行的文件讀取操作的信息
有關(guān)記錄期間進(jìn)行的文件寫入操作的信息
JFR系統(tǒng)
系統(tǒng)選項(xiàng)卡組包含配置,列出正在運(yùn)行的進(jìn)程和正在運(yùn)行 JVM 和 Java 應(yīng)用程序的系統(tǒng)上的環(huán)境變量苔埋。
有關(guān)正在運(yùn)行 Java 應(yīng)用程序的硬件和軟件的信息
含一個表懦砂,其中列出記錄期間正在系統(tǒng)中運(yùn)行的所有進(jìn)程
含一個表,其中列出啟動 JVM 時操作系統(tǒng)中設(shè)置的環(huán)境變量的鍵值對
JFR事件
事件選項(xiàng)卡組包含有關(guān)記錄期間收集的事件的信息组橄。JFR 記錄每個事件及其發(fā)生時間和與該事件關(guān)聯(lián)的數(shù)據(jù)荞膘。JMC5.5共支持80多種事件。默認(rèn)情況下玉工,并沒有開啟所有事件類型的記錄羽资,將對性能影響較大的 6 種類型事件關(guān)閉,以此達(dá)到將 JFR 對應(yīng)用程的影響降到 1%以內(nèi)遵班,對性能影響的大小由開啟記錄的事件的類型和數(shù)量有關(guān)屠升。
-
概覽
-
收集的事件的日志
事件標(biāo)簽組中的Log標(biāo)簽是查看每個單獨(dú)事件的絕佳地址
-
顯示各線程中的事件的時間表圖形
-
展示啟動所記錄事件的線程
-
記錄的事件的聚集堆棧跟蹤
-
事件屬性數(shù)據(jù)分布的文本表示形式
常用事件類型
事件類型 | JFR或其他工具獲取 | 只能JFR獲取 |
---|---|---|
Classloading | 被加載的類的數(shù)量和未被加載的類的數(shù)量 | 加載類的類加載器(classloader)潮改,加載一個類需要的時間 |
Thread statistics | 創(chuàng)建線程的數(shù)量、銷毀線程的數(shù)量腹暖、線程快照(dump) | 阻塞指定線程的鎖以及被指定鎖阻塞的線程 |
Throwables | 應(yīng)用程序?qū)嵱玫漠惓n?/td> | 應(yīng)用程序拋出的異常和錯誤的數(shù)量以及創(chuàng)建異常和錯誤的棧記錄 |
TLAB allocation | 內(nèi)存堆中已分配的數(shù)量汇在、TLAB(Thread-Local Allocation Buffers)的大小 | 在內(nèi)存對中指定對象的內(nèi)存分配以及為這些對象分配內(nèi)存的棧記錄 |
File and socket I/O | 進(jìn)行 I/O 消耗的時間 | 每一次讀寫調(diào)用的時間消耗,讀寫操作消耗時間過長的文件或套接字 |
Monitor blocked | 等待監(jiān)控器的線程 | 阻塞某個線程的監(jiān)控器脏答、線程被阻塞的時間 |
Code cache | 代碼緩存的大小以及內(nèi)容 | 從代碼緩存中移除的方法糕殉、代碼緩存的配置 |
Code compilation | 哪些方法被編譯,OSR 編譯殖告,編譯耗時 | JFR 中沒有額外的信息糙麦,但 JFR 總結(jié)了多個源文件的信息 |
Garbage collection | GC 的次數(shù),包括每一個階段的次數(shù)丛肮、每個代的大小 | JFR 中沒有額外的信息,但 JFR 總結(jié)了來自多個工具的信息 |
Profiling | 檢測分析和采樣分析 | JFR 并不能獲得分析器獲得的豐富信息魄缚,但 JFR 提供了更高層次的概述 |
Java Mission Control 通信
HotSpot JVM 使用基于遠(yuǎn)程方法調(diào)用 (RMI) 連接器的Java Management Extensions (JMX)技術(shù)啟用監(jiān)視和管理功能宝与。這也稱為基于RMI的JMX或簡稱 JMXRMI。要配置連接冶匹,啟動 JVM 時必須設(shè)置以下系統(tǒng)屬性:
-Dcom.sun.management.jmxremote
此選項(xiàng)用于切換 JMXRMI 的使用习劫。默認(rèn)情況下啟用該選項(xiàng),因此無需設(shè)置該選項(xiàng)就可以使用 JVM 的監(jiān)視功能嚼隘。要為 JVM 禁用 JMXRMI诽里,請指定 -Dcom.sun.management.jmxremote=false。-Dcom.sun.management.jmxremote.authenticate
該選項(xiàng)用于切換對 JMXRMI 連接使用口令驗(yàn)證飞蛹。默認(rèn)情況下此選項(xiàng)是啟用的谤狡。要為 JVM 禁用口令驗(yàn)證,請指定 -Dcom.sun.management.jmxremote.authenticate=false卧檐。
注意:禁用驗(yàn)證是不安全的墓懂。任何知道 (或猜中) JMX 端口號和主機(jī)名的遠(yuǎn)程用戶都能夠監(jiān)視和控制 Java 應(yīng)用程序和 VM。雖然開發(fā)時這是可接受的霉囚,但對于生產(chǎn)系統(tǒng)不建議這樣設(shè)置捕仔。
-Dcom.sun.management.jmxremote.port
此選項(xiàng)用于設(shè)置 JMXRMI 連接的端口號。必須設(shè)置未使用的端口號才能啟用 JVM 的監(jiān)視和管理功能盈罐。-Dcom.sun.management.jmxremote.ssl
此選項(xiàng)用于切換安全套接字層 Sockets Layer (SSL) 驗(yàn)證的使用。默認(rèn)情況下啟用該選項(xiàng)。要為 JVM 禁用 SSL 驗(yàn)證涡贱,請指定 -Dcom.sun.management.jmxremote.ssl=false巧勤。更多配置信息 請移步
JFR需要JDK的商業(yè)證書,需要解鎖JDK的商業(yè)特性票顾,例如:
jcmd 1152 VM.unlock_commercial_features
- 可以直接使用命令行來啟動JFR瓤逼,例如:
jcmd 41250 JFR.start delay=10s duration=1m filename=/Users/cc/Desktop/log.jfr
參考:
https://blog.csdn.net/u010397519/article/details/95635459