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