Oracle Java Mission Control:终极指南
“我們喜歡關(guān)注Mikhail Vorontsov的博客,并獲得他對Java Performance相關(guān)問題的看法。 我們曾多次被問到Takipi的Java錯誤分析與Java Mission Control和Java Flight Recorder有何不同。 因此,盡管工具之間的差異很大(主要是,JMC主要是桌面應(yīng)用程序,而Takipi是專門為大型生產(chǎn)環(huán)境設(shè)計的),但我們認為這是增加JMC全面概述的好機會。
除了Java Mission Control是桌面應(yīng)用程序之外,主要的區(qū)別在于使用Takipi,您將獲得始終在線的錯誤分析,直到導(dǎo)致每次錯誤的變量值和實際代碼。 因此,在JMC在概要分析中具有很高的價值,但在堆棧跟蹤級別停止的情況下,Takipi會深入研究實際代碼以幫助您重現(xiàn)和解決生產(chǎn)錯誤。
另一個區(qū)別是使用分布式系統(tǒng),JMC可在單臺計算機上工作,而Takipi的儀表板可在不同的計算機上顯示多個JVM。 因此,如果您要監(jiān)視大型生產(chǎn)系統(tǒng),請嘗試Takipi。 但是,如果您正在尋找一款出色的桌面分析工具,那么JMC可能就是您的最佳選擇?!?
–塔基皮(Takipi)Alex Zhitnitsky
新帖:Oracle Java任務(wù)控制:終極指南http://t.co/UaxThmzq61 pic.twitter.com/i0UScStu9u
— Takipi(@takipid) 2015年3月23日
Mikhail是java-performance.info的首席博客作者。 他一遍又一遍地工作,使Java應(yīng)用程序速度提高了5%,而且更加緊湊。 Mikhail喜歡在悉尼(澳大利亞)的一個郊區(qū)度過園藝和陪伴兒子的時光。
目錄
1. 簡介
2. Java任務(wù)控制
3. JMC許可證 4. 實時過程監(jiān)控 – 4.1 事件觸發(fā) – 4.2 內(nèi)存選項卡 – 4.3 線程選項卡 5. 使用Java Flight Recorder – 5.1 如何運行 – 5.2 初始屏幕 – 5.3 內(nèi)存選項卡 – 5.4 分配選項卡 – – 5.4.1 按類別 – – 5.4.2 通過線程 – – 5.4.3 分配配置文件 – 5.5 代碼選項卡 – – 5.5.1 熱門方法 – – 5.5.2 例外選項卡 – – 5.5.3 線程選項卡 – – 5.5.4 I / O選項卡 6. Java生產(chǎn)工具生態(tài)系統(tǒng)
1.簡介
本文將介紹Java Mission Control(一種自Java 7u40起可用的JDK GUI工具)以及Java Flight Recorder。
2. Java任務(wù)控制
從Java 7u40開始, Oracle Java Mission Control是Oracle JDK中提供的工具。 該工具源自JRockit JVM,已有多年的歷史。 由兩名JRockit高級開發(fā)人員撰寫的Oracle JRockit:權(quán)威指南中對JRockit及其版本的JMC進行了很好的描述(另請訪問Marcus Hirt博客 –您應(yīng)該查找JMC任何新聞的第一位)。
Oracle JMC可以用于兩個主要目的:
- 監(jiān)視多個正在運行的Oracle JVM的狀態(tài)
- Java Flight Recorder轉(zhuǎn)儲文件分析
3. JMC許可證
當(dāng)前的JMC許可證(請參見此處的 “補充許可條款”)允許您自由使用JMC進行開發(fā),但是如果要在生產(chǎn)中使用它,則需要購買商業(yè)許可證。
4.實時過程監(jiān)控
您可以通過在主窗口的“ JVM瀏覽器”選項卡中右鍵單擊并選擇“啟動JMX控制臺”菜單選項來附加到JVM。 您將看到以下屏幕。 這里沒有什么花哨的地方,只需注意“ +”按鈕,您可以在該屏幕上添加更多的計數(shù)器。
4.1事件觸發(fā)
觸發(fā)器允許您運行各種操作,以響應(yīng)某些JMX計數(shù)器超過給定時間段(可選)并保持在閾值以上。 例如,您可以在足夠長時間的高CPU活動的情況下觸發(fā)JFR記錄,以了解是什么原因?qū)е碌?#xff08;并且您不僅限于單個記錄!)。
請注意,觸發(fā)器可以在任何JMX計數(shù)器上運行(您是否看到“添加...”按鈕?)–您可以設(shè)置比標(biāo)準(zhǔn)分發(fā)版中可用觸發(fā)器更多的觸發(fā)器,并將設(shè)置導(dǎo)出到磁盤上。 您甚至可以使用自己的應(yīng)用程序JMX計數(shù)器。
轉(zhuǎn)到“規(guī)則詳細信息”窗口中的“操作”選項卡–您可以在此處指定在發(fā)生事件時要執(zhí)行的操作。
請注意,如果要正確使用JFR,您需要至少在Java 7 update 40中運行您的應(yīng)用程序–我無法記錄Java7u40之前的JRE的任何事件(可能是某些JRE版本之間的錯誤或不兼容……) 。
4.2內(nèi)存選項卡
下一個選項卡–“內(nèi)存”將為您提供有關(guān)應(yīng)用程序堆和垃圾回收的摘要信息。 請注意,您可以運行完整的GC并從該頁面請求堆轉(zhuǎn)儲(在屏幕截圖中突出顯示)。 但從本質(zhì)上講,此頁面只是一個不錯的UI,圍繞著其他來源提供的功能。
4.3線程選項卡
此標(biāo)簽可讓您查看應(yīng)用程序中正在運行的線程及其當(dāng)前堆棧轉(zhuǎn)儲的列表(每秒更新一次)。 它還可以讓您看到:
- 線程狀態(tài)-運行或阻塞/等待
- 鎖名
- 如果線程死鎖
- 線程被阻止的次數(shù)
- 每線程CPU使用率!
- 自啟動以來,給定線程分配的內(nèi)存量
請記住,您必須打開CPU分析,死鎖檢測和內(nèi)存分配跟蹤才能以實時模式獲取該信息:
5.使用Java Flight Recorder
Java Flight Recorder(在本文的其余部分中將其稱為JFR)是JMC的功能。 從用戶的角度來看,您以固定的記錄時間/最大記錄文件大小/最大記錄長度(您的應(yīng)用可以在此之前完成)運行JFR,然后等待直到記錄完成。 之后,您可以在JMC中對其進行分析。
5.1如何運行JFR
您需要向要連接的JVM添加以下兩個選項:
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder 接下來,如果您想從JFR獲得任何有用的信息,則需要連接到Java 7u40或更高版本。 文檔聲稱您可以從Java 7u4連接到任何JVM,但是我無法從這些JVM中獲得任何有用的信息。
要記住的第三件事是,默認情況下,JVM僅允許在安全點進行堆棧跟蹤。 因此,在某些情況下,您可能有不正確的堆棧跟蹤信息。 如果要更精確的堆棧跟蹤, JFR文檔會告訴您設(shè)置另外兩個參數(shù)(您將無法在運行的JVM上設(shè)置這些參數(shù)):
最后,如果您希望有盡可能多的文件I / O,Java異常和CPU性能分析信息,請確保已選擇啟用參數(shù),并將其閾值設(shè)置為“ 1 ms”。
5.2 JFR初始屏幕
JFR記錄的初始屏幕包含記錄期間的CPU和堆使用情況圖表。 將其視為您的過程的概述。 在此(和其他JFR屏幕)上,您唯一需要注意的是可以通過任何圖表選擇時間范圍進行分析的功能。 勾選“同步選擇”復(fù)選框,以在每個窗口上保持相同的時間范圍–這將使您僅檢查在此范圍內(nèi)發(fā)生的事件。
此屏幕上還有一個有趣的功能:底部的“ JVM信息”選項卡包含在已配置的JVM中設(shè)置的所有JVM參數(shù)的值。 您可以通過-XX:+ PrintFlagsFinal JVM選項獲取它們,但是通過UI遠程獲取它們更為方便:
5.3 Java Flight Recorder的“內(nèi)存”選項卡
內(nèi)存選項卡為您提供有關(guān)以下信息:
- 機器RAM和Java堆的使用情況(您可以輕松地猜測在錄制過程中是否發(fā)生了交換或GC過多)。
- 垃圾收集–何時,為什么,清理多長時間和清理多少空間。
- 內(nèi)存分配–在TLAB內(nèi)部/外部,按類/線程/堆棧跟蹤。
- 堆快照–類名占用的內(nèi)存數(shù)量/數(shù)量
本質(zhì)上,此選項卡將使您可以檢查應(yīng)用程序中的內(nèi)存分配率,它對GC施加的壓力以及哪些代碼路徑導(dǎo)致了意外的高分配率。 JFR還具有其非常特殊的功能–它允許分別跟蹤TLAB和全局堆分配(TLAB分配要快得多,因為它們不需要任何同步)。
通常,如果滿足以下條件,您的應(yīng)用將變得更快:
- 它分配較少的對象(按分配的RAM數(shù)量和數(shù)量)
- 您的舊(完整)垃圾收集較少,因為它們速度較慢并且需要停止運行(至少一段時間)
- 您已將非TLAB對象分配最小化
讓我們看看如何監(jiān)視此信息。 “概述”選項卡顯示有關(guān)內(nèi)存消耗/分配/垃圾收集的常規(guī)信息。
您可以在此處查看“預(yù)留堆”與“預(yù)留堆”的距離。 它顯示了在輸入尖峰的情況下您有多少保證金。 藍線(“ Used Heap”)顯示了舊一代中有多少數(shù)據(jù)正在泄漏/保持:如果您的鋸切模式隨著每一步的增長而增加,則舊一代正在增長。 每個步驟的最低點大約顯示了舊一代中的數(shù)據(jù)量(其中某些數(shù)據(jù)可能符合垃圾收集的條件)。 屏幕截圖上的模式表明,應(yīng)用程序僅分配由年輕一代GC收集的短壽命對象(可能是一些無狀態(tài)的處理)。
您還可以檢查“ TLAB的分配率”字段-它顯示每秒分配多少內(nèi)存(還有另一個計數(shù)器稱為“對象的分配率”,但通常應(yīng)該很低)。 126 Mb / sec(在示例中)是批處理的相當(dāng)平均速率(將其與HDD讀取速度進行比較),但對于大多數(shù)交互式應(yīng)用程序而言卻很高。 您可以將此數(shù)字用作總體對象分配優(yōu)化的指標(biāo)。
以下三個選項卡:“垃圾回收”,“ GC時間”和“ GC配置”非常明顯,它們可能是有關(guān)GC原因和GC導(dǎo)致的最長暫停(這會影響您的應(yīng)用程序延遲)的信息來源。
5.4 Java Flight Recorder的“分配”選項卡
“分配”選項卡為您提供有關(guān)所有對象分配的信息。 您應(yīng)該轉(zhuǎn)到“在新的TLAB中分配”標(biāo)簽。 在這里,您可以看到每個類(正在分配哪些類實例),每個線程(哪個線程分配了大多數(shù)對象)或每個調(diào)用堆棧(將其作為全局分配信息進行處理)的對象分配配置文件。
5.4.1按類別分配
讓我們看看您可以從每個選項卡中找到什么。 第一個(在上面的屏幕快照中)“按類分配”使您可以查看分配了最多類的類。 在中間選項卡中選擇一種類型,您將獲得該類實例的所有分配的分配統(tǒng)計信息(帶有堆棧跟蹤)。
您應(yīng)該在這里進行的第一步檢查是,是否??找到任何“無用的”對象分配:任何原始包裝器,例如Integer或Double(通常指示使用JDK集合), java.util.Date , java.util.GregorianCalendar , Pattern ,任何格式化程序等。我在最近的文章的第二部分中寫了一些內(nèi)存調(diào)整提示。 “堆棧跟蹤”選項卡將使您找到需要改進的代碼。
要檢查的另一個問題是過多的對象分配。 不幸的是,這里沒有給出一般性建議-您應(yīng)該使用常識來理解“過多”在應(yīng)用程序中的含義。 常見的問題是無用的防御性復(fù)制(對于只讀客戶端)和String.substring的過度使用,因為Java 7u6中 String類發(fā)生了更改。
5.4.2通過線程分配
如果您的應(yīng)用程序中有幾種數(shù)據(jù)處理類型的線程(或者您可以區(qū)分哪些任務(wù)由哪個線程運行),“按線程分配”選項卡可能會很有趣–在這種情況下,您可以找出每個線程的對象分配:
5.4.3分配配置文件
如果所有線程都是統(tǒng)一的(或者您只有一個數(shù)據(jù)處理線程),或者您只想查看高級分配信息,則直接轉(zhuǎn)到“分配配置文件”選項卡。 在這里,您將看到在所有線程中的每個調(diào)用堆棧上分配了多少內(nèi)存。
此視圖使您可以找到對內(nèi)存子系統(tǒng)施加最大壓力的代碼路徑。 您應(yīng)在此處區(qū)分預(yù)期分配和過度分配。 例如,如果從方法A多次調(diào)用方法B,并且方法B在其中分配了一些內(nèi)存,并且保證方法B的所有調(diào)用都返回相同的結(jié)果–這意味著您過多地調(diào)用了方法B。過多的方法調(diào)用的另一個示例/ object分配可以是Logger.log調(diào)用中的字符串連接 。 最后,提防任何迫使您創(chuàng)建可重復(fù)使用對象的優(yōu)化–僅在每個線程存儲的對象不超過一個的情況下才應(yīng)池/緩存對象(眾所周知的示例是ThreadLocal <DateFormat> )。
5.5 Java Flight Recorder的“代碼”選項卡
JFR視圖中的下一個大標(biāo)簽是“代碼”標(biāo)簽。 這對于CPU優(yōu)化非常有用:
概述選項卡為您提供2個視圖:“熱程序包”和“熱類”,在這里您可以查看每個Java包所花費的時間,在“熱類”中,您可以查看應(yīng)用程序中CPU最昂貴的類。
如果您使用一些對它們幾乎沒有控制權(quán)的第三方庫,并且希望獲得代碼(一個軟件包),第三方代碼(其他一些軟件包)和JDK(一個幾個軟件包)。 同時,我將其稱為“ CIO / CTO視圖”,因為它不是交互式的,并且不能讓您看到這些包中的哪些類應(yīng)歸咎于。 作為開發(fā)人員,最好在此標(biāo)簽中的大多數(shù)其他表上使用過濾:
5.5.1熱門方法/調(diào)用樹選項卡
實際上,“ Hot Methods”和“ Call Tree”選項卡是任何Java分析器提供的普通視圖。 它們顯示了您的應(yīng)用程序熱點-應(yīng)用程序花費了大部分時間的方法以及導(dǎo)致這些熱點的代碼路徑。 通常,您應(yīng)該從“熱方法”選項卡開始調(diào)整應(yīng)用程序CPU,然后在“調(diào)用樹”選項卡中檢查整體圖像是否足夠合理。
您應(yīng)該意識到,所有“低影響”分析器都在使用采樣來獲取CPU概要文件。 采樣探查器會定期對所有應(yīng)用程序線程進行堆棧跟蹤轉(zhuǎn)儲。 通常的采樣時間為10毫秒。 通常不建議將此時間縮短到少于1 ms,因為采樣影響將開始變得明顯。
結(jié)果,您將看到的CPU配置文件在統(tǒng)計上是有效的,但并不精確。 例如,您可能不太幸運在采樣間隔內(nèi)碰到一些很少見的方法。 有時會發(fā)生這種情況……如果您懷疑探查器向您顯示的信息不正確,請嘗試重新組織“熱”方法–將方法內(nèi)聯(lián)到最熱路徑的調(diào)用方中,或者相反,嘗試將方法拆分為2部分–足以從探查器視圖中刪除方法。
5.5.2例外選項卡
“例外”選項卡是“代碼”視圖中的最后一個選項卡,在常規(guī)優(yōu)化情況下值得關(guān)注。 引發(fā)Java異常非常慢 ,必須嚴格限制它們在高性能代碼中的特殊使用情況。
“例外”視圖將為您提供有關(guān)記錄過程中引發(fā)的例外數(shù)量及其堆棧跟蹤和詳細信息的統(tǒng)計信息。 瀏覽“概述”標(biāo)簽,然后查看是否看到:
- 任何意外的例外
- 意外的異常數(shù)量
如果發(fā)現(xiàn)任何可疑的內(nèi)容,請轉(zhuǎn)到“例外”選項卡并檢查例外的詳細信息。 嘗試擺脫至少大多數(shù)。
5.6 JFR線程選項卡
“ JFR線程”選項卡為您提供以下信息:
- CPU使用率/線程計數(shù)表
- 每個線程的CPU配置文件–與“代碼”選項卡上的配置文件類似,但基于每個線程
- 競爭–哪些線程被哪些線程阻塞以及持續(xù)多長時間
- 延遲–導(dǎo)致應(yīng)用程序線程進入等待狀態(tài)的原因(您將在此處清楚地看到一些JFR開銷)
- 鎖實例–導(dǎo)致線程爭用的鎖
我不會在本文中詳細介紹此選項卡,因為僅對于高級高級優(yōu)化(例如鎖剝離,原子/易失變量,非阻塞算法等)才需要此選項卡。
5.7 JFR I / O選項卡
“ I / O”選項卡應(yīng)用于檢查應(yīng)用程序中的文件和套接字輸入/輸出。 它使您可以查看應(yīng)用程序正在處理的文件,讀/寫的大小以及完成I / O操作所需的時間。 您還可以在應(yīng)用程序中查看I / O事件的順序。
與大多數(shù)其他Java Flight Recorder選項卡一樣,您需要自己解釋此選項卡的輸出。 以下是一些您可能會問自己的示例問題:
- 我是否看到任何意外的I / O操作(在我不希望在此處看到的文件上)?
- 我是否多次打開/讀取/關(guān)閉同一文件?
- 是否需要讀/寫塊大小? 他們不是太小了嗎?
請注意,如果使用SSD,強烈建議將“文件讀取閾值” JFR參數(shù)(可以在開始JFR記錄時進行設(shè)置)減小到1 ms。 您可能會錯過默認值為10毫秒閾值的SSD上太多的I / O事件。 I / O“概述”選項卡很棒,但與以下4個專用選項卡相比,它不提供任何額外的信息。 4個專用選項卡(文件讀/寫,套接字讀/寫)中的每個選項卡彼此相似,因此讓我們看一下其中的一個-“文件讀”。
這里有3個標(biāo)簽:“按文件”,“按線程”和“按事件”。 前兩個選項卡按文件和線程將操作分組。 最后一個選項卡僅列出所有I / O事件,但是如果您要調(diào)查對特定文件執(zhí)行了哪些操作(按“路徑”過濾),或者想弄清楚是否短時發(fā)出了讀取請求,則該選項卡可能非常有用。大量數(shù)據(jù)(按“讀取的字節(jié)數(shù)”排序),這會損害應(yīng)用程序的性能。 通常,您應(yīng)該始終緩沖磁盤讀取,以便僅文件尾部讀取會小于緩沖區(qū)大小。
請注意,I / O信息也是通過采樣收集的,因此“ I / O”選項卡中將缺少某些(或很多)文件操作。 這在頂級固態(tài)硬盤上尤其明顯。
還有一個相關(guān)的屏幕,使您可以按各個字段對I / O(和其他一些)事件進行分組。 例如,您可能想要找出多少個讀操作已讀取給定數(shù)量的字節(jié)(并檢查其堆棧跟蹤)。 轉(zhuǎn)到JFR視圖左側(cè)的“事件”標(biāo)簽,然后轉(zhuǎn)到最后一個名為“直方圖”的標(biāo)簽。
您可以在此處按可用列對各種事件進行過濾/排序/分組。 每個JFR事件都有一個相關(guān)的堆棧跟蹤,因此您可以查看所選事件的堆棧跟蹤信息:
JFR沒有涵蓋一個基本的性能調(diào)優(yōu)領(lǐng)域:內(nèi)存使用反模式,例如重復(fù)的字符串或容量很大的幾乎為空的集合。 JFR不為您提供此類信息,因為您需要進行堆轉(zhuǎn)儲才能進行此類分析。 那是您需要一個名為“ JOverflow Analysis”的JMC插件的地方。
6. Java生產(chǎn)工具生態(tài)系統(tǒng)
在Takipi的先前文章中,我們介紹了用于生產(chǎn)的Java工具生態(tài)系統(tǒng)。 如果您想發(fā)現(xiàn)更多新工具,可以查看以下文章:
- 主要版本發(fā)布后Java開發(fā)人員應(yīng)使用的15種工具
- 異步進入主流:您必須知道的7種反應(yīng)式編程工具
- Java開發(fā)人員應(yīng)該知道的7種新工具
翻譯自: https://www.javacodegeeks.com/2015/03/oracle-java-mission-control-the-ultimate-guide.html
總結(jié)
以上是生活随笔為你收集整理的Oracle Java Mission Control:终极指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优酷路由宝怎么赚钱如何让优酷路由器多赚钱
- 下一篇: 另一个Java 8 Lamdbas和St